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_Num
或 Result_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
假设我有以下 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_Num
或 Result_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