熊猫组合包含字符串的重复列

时间:2018-07-26 01:47:35

标签: python pandas pandas-groupby

我在合并重复的列时遇到了问题。它似乎可以在较旧版本的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

有什么想法吗?

3 个答案:

答案 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