Pandas数据框通过逗号将重复列组合成一个单独的数据

Rtu*_*tut 4 python dataframe pandas

我的数据框有很少的重复列名.如果找到重复的列名称,请将重复列合并为一列.我还想保留用逗号分隔的重复列数据.任何人都可以建议一种方法来做到这一点.

我在下面构建了一个例子.在我的实际数据帧中,列名称未知.

输入数据框架:

  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
Run Code Online (Sandbox Code Playgroud)

可以阅读:

df = pd.read_clipboard(names=['Col1','Col2','Col3','Col2'], skiprows=1)
Run Code Online (Sandbox Code Playgroud)

输出数据框架:

  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
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 7

你也可以:

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
Run Code Online (Sandbox Code Playgroud)

详细信息: 用于.groupby()df.columns重复项进行分组:

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

<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, A to E
Data columns (total 1 columns):
Col1    5 non-null object
dtypes: object(1)
memory usage: 80.0+ bytes
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, A to E
Data columns (total 2 columns):
Col2    5 non-null object
Col2    5 non-null object
dtypes: object(2)
memory usage: 120.0+ bytes
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, A to E
Data columns (total 1 columns):
Col3    5 non-null object
dtypes: object(1)
Run Code Online (Sandbox Code Playgroud)

然后,使用.agg()','.join()倒塌的.valuesgrouped列,这如下所示:

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]]
Run Code Online (Sandbox Code Playgroud)

由于只有重复的列有多个值,所以只有它们会被连接起来,这样你就会得到:

      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
Run Code Online (Sandbox Code Playgroud)

使用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))
Run Code Online (Sandbox Code Playgroud)

要得到:

      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
Run Code Online (Sandbox Code Playgroud)


Max*_*axU 5

你可以这样做:

df.T.groupby(level=0).agg(','.join).T
Run Code Online (Sandbox Code Playgroud)

数据:

In [207]: df
Out[207]:
      Col1 Col2 Col1 Col2 Col3
Index
A      CA1  CA2  CA3  CA5  ZA1
B      CB1  CB2  CB3  CB5  ZA2
C      CC1  CC2  CC3  CC5  ZA3
D      CD1  CD2  CD3  CD5  ZA4
E      CE1  CE2  CE3  CE5  ZA5
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

说明:

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
Run Code Online (Sandbox Code Playgroud)