Python pandas中数据帧的切片和排列
我想将数据帧中的数据排列成多个数据帧或组。输入数据为Python pandas中数据帧的切片和排列,python,pandas,Python,Pandas,我想将数据帧中的数据排列成多个数据帧或组。输入数据为 id channel path 15 direct a1 15 direct a2 15 direct a3 15 direct a4 213 paid b2 213 paid b1 2222 direct as25 2222 direct dw46 2222 direct 32q 3111 paid d32a 3111 paid 23ff 3111 paid
id channel path
15 direct a1
15 direct a2
15 direct a3
15 direct a4
213 paid b2
213 paid b1
2222 direct as25
2222 direct dw46
2222 direct 32q
3111 paid d32a
3111 paid 23ff
3111 paid www32
3111 paid 2d2
所需的输出应该是
id channel p1 p2
213 paid b2 b2
id channel p1 p2 p3
2222 direct as25 dw46 dw46
id channel p1 p2 p3 p4
15 direct a1 a2 a3 a4
3111 paid d32a 23ff www32 2d2
请告诉我实现它的方法。谢谢我想你可以先创建helper列
cols
,然后再创建。
然后您需要找到列的长度(先减2)和
通过此长度
。每组中的最后一列:
df['cols'] = 'p' + (df.groupby('id')['id'].cumcount() + 1).astype(str)
df1 = df.pivot_table(index=['id', 'channel'],
columns='cols',
values='path',
aggfunc='first').reset_index().rename_axis(None, axis=1)
print df1
id channel p1 p2 p3 p4
0 15 direct a1 a2 a3 a4
1 213 paid b2 b1 None None
2 2222 direct as25 dw46 32q None
3 3111 paid d32a 23ff www32 2d2
print df1.apply(lambda x: x.notnull().sum() - 2 , axis=1)
0 4
1 2
2 3
3 4
dtype: int64
for i, g in df1.groupby(df1.apply(lambda x: x.notnull().sum() - 2 , axis=1)):
print i
print g.dropna(axis=1)
2
id channel p1 p2
1 213 paid b2 b1
3
id channel p1 p2 p3
2 2222 direct as25 dw46 32q
4
id channel p1 p2 p3 p4
0 15 direct a1 a2 a3 a4
3 3111 paid d32a 23ff www32 2d2
对于存储,您可以使用数据帧的字典:
dfs={i: g.dropna(axis=1)
for i, g in df1.groupby(df1.apply(lambda x: x.notnull().sum() - 2 , axis=1))}
#select DataFrame with len=2
print dfs[2]
id channel p1 p2
1 213 paid b2 b1
#select DataFrame with len=3
print dfs[3]
id channel p1 p2 p3
2 2222 direct as25 dw46 32q
使用代码块而不是图像,这将使其他人更容易复制您的示例。我收到一个错误#如果传递了dict,重命名器函数[TypeError:必须传递索引才能重命名],我认为您必须使用pandas
版本0.18.0
。但如果您的版本较低,请忽略。重命名\u axis(无,axis=1)
很高兴能帮助您!祝你好运我将其应用于大量数据,在转换为pivot之后,行标题的顺序不是连续的。就像p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24 p25 p26 p27 p28 p29 p30 p1019 p102 p1020 p1021 p1022 p1023 p1024 p1025 p1026 p1027 p1028 p1029 p103 p1030 p1032 p1033 p1034 p1035 p1036 p1037 p1038 p1039 p1041 p1042 p1044 p1045 p1045 p1046 p1047 p1048 p1058 p1058 p1058 p10581059 p106 p1060 p1061 p1062 p1063 p1064 p1065和更多类似的功能我认为您可以添加到函数groupby
参数sort=False
。