对熊猫中相同的列名称进行分组会在列中添加“ .1”

时间:2019-03-20 02:15:02

标签: python pandas pandas-groupby

我正在尝试将同一列分组在一个数据框中,类似于以下问题:Grouping on identical column names in pandas

但是该答案对我不起作用。当我将接受的答案应用于该问题时,我的数据框将“ .1”添加到重复列的第二次迭代中。我重复的列没有重复的数据,这可能是问题所在吗?

这是我的桌子:

Timepoint Col1 Col2 Col3 Col1 Col2 Col3

   1       1    2   3
   2       4    5   6
   3                      7    8    9
   4                      10   11   12

我希望表格看起来像这样:

Timepoint Col1 Col2 Col3 
     1     1    2   3
     2     4    5   6
     3     7    8   9
     4     10   11  12

但是当我应用链接的代码时,表如下所示:

Timepoint Col1 Col2 Col3 Col1.1 Col2.1 Col3.1

   1       1    2   3
   2       4    5   6
   3                      7      8     9
   4                      10     11    12

我的数据框有数百列,所以我需要一个不指定需要分组的列的解决方案。

请注意,这不是该问题的重复:Shift NaNs to the end of their respective rows,因为该问题没有重复的列名,并且会将数据转移到标签不同的列。

2 个答案:

答案 0 :(得分:0)

解决方案示例:

import pandas as pd


data = """
Timepoint,Col1,Col2,Col3,Col1,Col2,Col3
1,1,2,3,,,
2,4,5,6,,,
3,,,,7,8,9
4,,,,10,11,12 
"""
df = pd.read_csv(pd.compat.StringIO(data), sep=',')
df.rename(columns=lambda x: x.split('.')[0], inplace=True)
print(df)

输出:

   Timepoint  Col1  Col2  Col3  Col1  Col2  Col3
0          1   1.0   2.0   3.0   NaN   NaN   NaN
1          2   4.0   5.0   6.0   NaN   NaN   NaN
2          3   NaN   NaN   NaN   7.0   8.0   9.0
3          4   NaN   NaN   NaN  10.0  11.0  12.0

df = df.fillna(0)
print(df)

输出:

   Timepoint  Col1  Col2  Col3  Col1  Col2  Col3
0          1   1.0   2.0   3.0   0.0   0.0   0.0
1          2   4.0   5.0   6.0   0.0   0.0   0.0
2          3   0.0   0.0   0.0   7.0   8.0   9.0
3          4   0.0   0.0   0.0  10.0  11.0  12.0

df = df.groupby(level=0, axis=1).sum()
print(df)

输出:

   Col1  Col2  Col3  Timepoint
0   1.0   2.0   3.0        1.0
1   4.0   5.0   6.0        2.0
2   7.0   8.0   9.0        3.0
3  10.0  11.0  12.0        4.0

答案 1 :(得分:0)

通过TimepointDataFrame.set_index创建索引,然后将groupby与具有split的lambda函数一起使用,并汇总summax,或meanfirst。聚合方法取决于数据,但如果总是像样例数据输出中那样错误地设置值,则总是相同的:

df = (df.set_index('Timepoint')
       .groupby(lambda x: x.split('.')[0], axis=1).sum()
       .reset_index())
print (df)
   Timepoint  Col1  Col2  Col3
0          1   1.0   2.0   3.0
1          2   4.0   5.0   6.0
2          3   7.0   8.0   9.0
3          4  10.0  11.0  12.0