我在Pandas中有一个Dataframe,如下所示:
ID rating G1 G2 G3 G4 G5 G6 G7
0 1 2.5 18 0 0 0 0 0 0
1 4 4.0 18 0 0 0 0 0 0
2 7 3.0 78 1 0 0 0 0 0
3 1 4.0 21 7 8 10 30 40 20
4 21 3.0 18 0 0 0 0 0 0
5 7 2.0 18 80 10 11 8 0 0
6 41 3.5 18 0 9 10 0 0 0
我想通过ID来组合所有元素,以便在熊猫中获得一种具有以下行数组条目的continuos数据帧:
ID H1 H2
0 1 [2.5,18] [4.0,21,7,8,10,30,40,20]
1 4 [4.0,18] Nan
2 7 [3.0,78] [2.0, 18, 80, 10, 11,8]
3 21 [3.0,18] Nan
4 41 [3.5,18,76,9,10] Nan
你知道有可能吗?谢谢
抱歉-早些参加会议:这就是我要解决的问题:
df1 = df.groupby([df.index, "ID"]).agg(
lambda x: x.replace(0, np.nan).dropna().tolist())
# Create a sum of each list
df1['list_'] = df1.sum(axis=1)
print(df1['list_'])
0 [2.5, 18]
1 [4.0, 18]
2 [3.0, 78, 1]
3 [4.0, 21, 7, 8, 10, 30, 40, 20]
4 [3.0, 18]
5 [2.0, 18, 80, 10, 11, 8]
6 [3.5, 18, 9, 10]
Name: list_, dtype: object
然后创建带有累加计数的计数器列,并使用交叉表进行数据透视。
# Create a row to use for columns
df1['count'] = 'H' + (df1.groupby('ID').cumcount() + 1).astype(str)
df1.reset_index(level=1,inplace=True)
final_ = pd.crosstab(df1["ID"],
df1["count"],
values=df1["list_"],
aggfunc="first").reset_index()
print(final_)
ID H1 H2
0 1 [2.5, 18] [4.0, 21, 7, 8, 10, 30, 40, 20]
1 4 [4.0, 18] NaN
2 7 [3.0, 78, 1] [2.0, 18, 80, 10, 11, 8]
3 21 [3.0, 18] NaN
4 41 [3.5, 18, 9, 10] NaN
我唯一可以看到的痛点是我的list_列是一个对象,不确定是否稍后会对其进行进一步的操作。如果这样,Jezrael的解决方案将更合适。
编辑遇到此问题的其他人:
使用python的方法.sum()
是最慢的列表连接方法之一,如果要考虑性能,请参阅:如何从列表列表中制作一个平面列表
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句