Python 根据条件旋转

Python pivoting with conditions

假设我有以下 DataFrame:

ClassID Name Result_Str Result_Num
123 TA Clark
456 TA Boris
456 Tony >87
123 Sam <45
456 Anna 89
456 Theo 67

我希望能够转向这样的事情,其中​​包含 >、< 的 值被放入与 [= 的情况类似的列中38=]:

|ClassID| TA  |Anna|Tony|Sam|Theo|
|-------|-----|----|----|---|----|
|123    |Clark|    |    |<45|    |
|456    |Boris|89  |>87 |   |67  |

我知道 pandas df.pivot 允许我们这样做

df.pivot(index="ClassID", columns="Name",values="Result_Str")
df.pivot(index="ClassID", columns="Name",values="Result_Num")

但是 values 是否可以根据 Result_NumResult_Str 是否 defined/not 等于 ""

成为条件

谢谢,

你必须在 pivot 之前准备你的 dataframe。首先,(1) 创建一个布尔掩码以查找不在右列中的值并移动它们。然后,(2A) 将您的数据框拆分为 2 个子数据框:一个用于 Result_Str 列,另一个用于 Result_Num 列,然后 (2B) 对它们进行透视。最后,(3) 在 ClassID 列合并您的 2 个数据框:

# (1)
m = df['Result_Str'].str[0].isin(['<', '>'])
df.loc[m, 'Result_Num'], df.loc[m, 'Result_Str'] = df.loc[m, 'Result_Str'], np.nan

# (2A)
df1 = df.loc[df['Result_Str'].notna()].drop(columns='Result_Num')
df2 = df.loc[df['Result_Num'].notna()].drop(columns='Result_Str')

# (2B)
df1 = df1.pivot(index='ClassID', columns='Name', values='Result_Str')
df2 = df2.pivot(index='ClassID', columns='Name', values='Result_Num')

# (3)
out = pd.merge(df1, df2, on='ClassID').rename_axis(columns=None).reset_index()

输出结果:

>>> out
   ClassID     TA  Anna  Sam  Theo Tony
0      123  Clark   NaN  <45   NaN  NaN
1      456  Boris  89.0  NaN  67.0  >87