我在合并重复的列时遇到了问题。它似乎可以在较旧版本的Pandas / Python上运行(不确定问题出在哪里),但在最新版本上却不能。
我基本上在concat之后有一个混合值的数据框,其中列名重复。这些值将是一个int,字符串或nan。对于每个重复的列名称,所有非Nan值都将相同,因此从理论上讲max()应该可以解决问题。
说我有数据框:
col1 col1 col2 col2 col3
0 Foo nan nan Bar Baz
1 nan nan Bar Bar nan
2 0 nan 1 nan 1
我的目标是获得
col1 col2 col3
0 Foo Bar Baz
1 nan Bar nan
2 0 1 1
这样做
df.groupby(df.columns,axis=1).max()
与Pandas / Python的较旧版本完全一样,但不适用于最新版本。这就是我得到的最新版本:
col1 col2 col3
0 nan nan Baz
1 nan nan nan
2 0 1 1
有什么想法吗?
答案 0 :(得分:0)
您的算法是一个很好的算法,您可以尝试:
df.groupby(df.columns,axis=1).max(axis=1)
答案 1 :(得分:0)
猜想当您尝试将字符串与np.nan
比较时会出现问题
一种解决方法是使用空字符串而不是np.nan
df.fillna('').groupby(df.columns, axis=1).max()
bar baz foo
0 Bar Baz Foo
1 Bar
2 1 1 0
如有需要,可以再返回np.nan
.replace('', np.nan)
bar baz foo
0 Bar Baz Foo
1 Bar NaN NaN
2 1 1 0
edit
如果您不想使用替代方法,或者数据框中可能存在''
,则可以定义自己的max函数并使用它进行汇总>
def mmax(s):
s = [z for z in s if not pd.isnull(z)]
if not len(s): return np.nan
return max(s)
def a(s):
return(s.agg(mmax, axis=1))
df.groupby(df.columns, axis=1).agg(a)
输出
bar baz foo
0 Bar Baz Foo
1 Bar NaN NaN
2 1 1 0
答案 2 :(得分:0)
我认为您首先需要transpose
数据帧,reset the index
,然后rename
重复的index
列值,最后需要使用groupby
。
df_t = df.T.reset_index()
df_t["index"] = df_t["index"].str.split(".").str[0]
result = df_t.groupby("index").first().T
输出
Out[57]:
index col1 col2 col3
0 Foo Bar Baz
1 NaN Bar NaN
2 0 1 1