Pandas dataframe通过comm将重复的列合并为一个单独的数据

2024-09-28 22:38:49 发布

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

我的数据帧几乎没有重复的列名。如果发现重复的列名,请将重复的列合并为一个。我还想保留用逗号分隔的重复列数据。有谁能给我一个建议吗。在

我在下面构建了一个例子。在我的实际数据帧列名是未知的。在

输入数据帧:

  Col1 Col2 Col3 Col2
A  CA1  CA5  CA3  CA5
B  CB1  CB5  CB3  CB5
C  CC1  CC5  CC3  CC5
D  CD1  CD5  CD3  None
E  CE1  CE5  CE3  CE5

可通过以下方式读取:

^{pr2}$

输出数据帧:

  Col1     Col2 Col3
A  CA1  CA5,CA5  CA3
B  CB1  CB5,CB5  CB3
C  CC1  CC5,CC5  CC3
D  CD1  CD5  CD3
E  CE1  CE5,CE5  CE3

Tags: 数据col2col3col1cd1cc1cc3ca3
3条回答

你可以这样做:

df.T.groupby(level=0).agg(','.join).T

数据:

^{2}$

输出:

In [208]: df.T.groupby(level=0).agg(','.join).T
Out[208]:
          Col1     Col2 Col3
Index
A      CA1,CA3  CA2,CA5  ZA1
B      CB1,CB3  CB2,CB5  ZA2
C      CC1,CC3  CC2,CC5  ZA3
D      CD1,CD3  CD2,CD5  ZA4
E      CE1,CE3  CE2,CE5  ZA5

说明:

In [209]: df.T
Out[209]:
Index    A    B    C    D    E
Col1   CA1  CB1  CC1  CD1  CE1
Col2   CA2  CB2  CC2  CD2  CE2
Col1   CA3  CB3  CC3  CD3  CE3
Col2   CA5  CB5  CC5  CD5  CE5
Col3   ZA1  ZA2  ZA3  ZA4  ZA5

In [210]: df.T.groupby(level=0).agg(','.join)
Out[210]:
Index        A        B        C        D        E
Col1   CA1,CA3  CB1,CB3  CC1,CC3  CD1,CD3  CE1,CE3
Col2   CA2,CA5  CB2,CB5  CC2,CC5  CD2,CD5  CE2,CE5
Col3       ZA1      ZA2      ZA3      ZA4      ZA5

我觉得很惭愧发这个。但它是有效的。在

df = pd.DataFrame(np.random.choice(('a', 'b', 'c'), (5, 4)), list('ABCDE'), ['Col1', 'Col2', 'Col3', 'Col2'])

pd.concat([pd.DataFrame(c) for i, c in df.iteritems()], axis=1, keys=range(len(df.columns))).swaplevel(0, 1, 1).sort_index(1).groupby(level=0, axis=1).apply(lambda df: df.apply(lambda x: ','.join(x.values), axis=1))

有点崩溃了。在

^{2}$

您还可以:

df.groupby(df.columns, axis=1).agg(lambda x: ','.join(x.values)))

      Col1     Col2 Col3
Index                   
A      CA1  CA2,CA5  CA3
B      CB1  CB2,CB5  CB3
C      CC1  CC2,CC5  CC3
D      CD1  CD2,CD5  CD3
E      CE1  CE2,CE5  CE3

详细信息:在df.columns上使用.groupby()对重复项进行分组:

^{2}$

然后,使用.agg()','.join()折叠grouped列中的{},如下所示:

df.groupby(df.columns, axis=1).apply(lambda x: x.values)

Col1                  [[CA1], [CB1], [CC1], [CD1], [CE1]]
Col2    [[CA5, CA5], [CB5, CB5], [CC5, CC5], [CD5, CD5...
Col3                  [[CA3], [CB3], [CC3], [CD3], [CE3]]

由于只有重复列具有多个值,因此只有它们将被联接,因此您可以得到:

      Col1     Col2 Col3
Index                   
A      CA1  CA5,CA5  CA3
B      CB1  CB5,CB5  CB3
C      CC1  CC5,CC5  CC3
D      CD1  CD5,CD5  CD3
E      CE1  CE5,CE5  CE3

使用None类型值,您可以:

df.groupby(df.columns, axis=1).apply(lambda x: x.apply(lambda y: ','.join([l for l in y if l is not None]), axis=1))

获得:

      Col1     Col2 Col3
Index                   
A      CA1  CA5,CA5  CA3
B      CB1  CB5,CB5  CB3
C      CC1  CC5,CC5  CC3
D      CD1      CD5  CD3
E      CE1  CE5,CE5  CE3

相关问题 更多 >