将多个数据框线合并为聚合线

时间:2017-08-23 14:26:44

标签: python pandas

对于以下数据框:

df = pd.DataFrame({'Name': {0: "A", 1: "A", 2:"A", 3: "B"}, 
       'Spec1': {0: '1', 1: '3', 2:'5',
                3: '1'},
       'Spec2': {0: '2a', 1: np.nan, 2:np.nan,
                3: np.nan}       
              }, columns=['Name', 'Spec1', 'Spec2'])

  Name Spec1 Spec2
0    A     1    2a
1    A     3   NaN
2    A     5   NaN
3    B     1   NaN

我想将列聚合到:

  Name Spec
0    A    1,3,5,2a
1    B    1

是否有更多"熊猫"这样做的方式不仅仅是循环和跟踪值?

3 个答案:

答案 0 :(得分:0)

按名称对行进行分组,将列值组合为列表,删除NaN

df = df.groupby('Name').agg(lambda x: list(x.dropna()))

          Spec1 Spec2
Name                 
A     [1, 3, 5]  [2a]
B           [1]    []

现在合并Spec1Spec2列表。将Name作为列返回。将新Spec列命名为

df = (df.Spec1 + df.Spec2).reset_index().rename(columns={0:"Spec"})

  Name           Spec
0    A  [1, 3, 5, 2a]
1    B            [1]

最后,将Spec列表转换为字符串表示形式:

df.Spec = df.Spec.apply(','.join)

  Name      Spec
0    A  1,3,5,2a
1    B         1

答案 1 :(得分:0)

另一种方式

In [966]: (df.set_index('Name').unstack()
             .dropna().reset_index()
             .groupby('Name')[0].apply(','.join))
Out[966]:
Name
A    1,3,5,2a
B           1
Name: 0, dtype: object

答案 2 :(得分:0)

或使用melt

df.melt('Name').groupby('Name').value.apply(lambda x:','.join(pd.Series(x).dropna())).reset_index().rename(columns={'value':'spec'})



Out[2226]: 
  Name      spec
0    A  1,3,5,2a
1    B         1