带条件的Python数据透视

2024-09-18 14:47:05 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

^{tb1}$

我希望能够转向这样的内容,值包含><被放入类似的列中,与结果\u Num的情况相同:

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

我知道,通过熊猫,df.pivot允许我们这样做

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

但是,是否可以根据Result_NumResult_Str是否定义/不等于“”来设置条件

谢谢


Tags: columns数据nameltgt内容dfindex
1条回答
网友
1楼 · 发布于 2024-09-18 14:47:05

在pivot之前,您必须准备好数据帧。首先,(1)创建一个布尔掩码以查找不在右列中的值并移动它们。然后,(2A)将数据帧拆分为两个子数据帧:一个子数据帧用于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

相关问题 更多 >