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