Panda组合包含字符串的重复列



我在组合重复列时遇到了问题。它似乎适用于旧版本的Pandas/Python(不确定罪魁祸首是什么(,但不适用于最新版本。

我基本上有一个混合值的数据帧,在concat之后有重复的列名。这些值要么是int,要么是string,要么是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

有什么想法吗?

我认为您首先需要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

猜测当您尝试将字符串与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

如果您不想使用变通方法,或者''可能存在于您的数据帧中,您可以定义自己的最大函数并使用它来聚合

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

你的算法很好,你能试试吗:

df.groupby(df.columns,axis=1).max(axis=1)

最新更新