我正在尝试将同一列分组在一个数据框中,类似于以下问题: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,因为该问题没有重复的列名,并且会将数据转移到标签不同的列。
答案 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)
通过Timepoint
和DataFrame.set_index
创建索引,然后将groupby
与具有split
的lambda函数一起使用,并汇总sum
或max
,或mean
或first
。聚合方法取决于数据,但如果总是像样例数据输出中那样错误地设置值,则总是相同的:
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