【问题标题】:Adding new column with most popular string value in each row in Pandas DataFrame在 Pandas DataFrame 的每一行中添加具有最流行字符串值的新列
【发布时间】:2020-10-18 19:41:53
【问题描述】:

我有一个非常大(1500 万行)的 pandas 数据框 df,下面给出了示例:

import pandas as pd
df = pd.DataFrame({'a':['ar', 're' ,'rw', 'rew', 'are'], 'b':['gh', 're', 'ww', 'rew', 'all'], 'c':['ar', 're', 'ww', '', 'different']})
df
     a    b          c
0   ar   gh         ar
1   re   re         re
2   rw   ww         ww
3  rew  rew         
4  are  all  different

我想添加另一列 d,它具有其他 3 列中最常见的值(在实际数据框中可能是 4 或 5 列),即 a, b, c 在这种情况下。所以输出看起来像df,如下所示:

     a    b          c     d
0   ar   gh         ar    ar
1   re   re         re    re
2   rw   ww         ww    ww
3  rew  rew              rew
4  are  all  different    

考虑到df 的大小为 1500 万行,在不使用可能非常慢(45 分钟到一个小时)的 lambda 函数的情况下实现它的最有效方法是什么。

【问题讨论】:

  • df.mode(axis=1).iloc[:,0] ?
  • 感谢@anky 不知道模式也适用于字符串。让我试试大号df
  • @anky 17 分钟后仍未返回。
  • 没有没有尝试np.wheredf 大约有 1700 万行。
  • 当然.....@anky.

标签: python-3.x pandas string dataframe


【解决方案1】:

IIUC,你需要:

m = df.mode(axis=1).iloc[:,0]
df['d'] = m.mask(df.nunique(1).eq(df.shape[1])) #for all are different condition

为了更快的选择:

df['d'] = np.where(df.nunique(1).eq(df.shape[1]),np.nan,df.mode(axis=1).iloc[:,0])

     a    b          c    d
0   ar   gh         ar   ar
1   re   re         re   re
2   rw   ww         ww   ww
3  rew  rew             rew
4  are  all  different  NaN

【讨论】:

    【解决方案2】:

    你可以用value_countsstack

    s=df.stack().groupby(level=0).value_counts()
    df['New']=s[s>1].reset_index(level=1)['level_1']
    df
         a    b          c  New
    0   ar   gh         ar   ar
    1   re   re         re   re
    2   rw   ww         ww   ww
    3  rew  rew             rew
    4  are  all  different  NaN
    

    【讨论】:

    • KeyError: '标签 [ at 0x1053a6de8>] 不在 [index] 中'
    • 它还有一个 lamdba 函数,对于 1500 万行数据可能会很慢。
    • @Gerry 你可以拆分
    【解决方案3】:

    您可以使用pd.mode 查找最常见的值,然后删除具有多种模式的值:

    import numpy as np
    
    mode = df.mode(axis=1)
    the_most_frequent_value = mode[0]
    multiple_mode = mode.count(axis=1) > 1
    the_most_frequent_value.loc[ multiple_mode ] = np.nan
    
    df['d'] = the_most_frequent_value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2017-08-09
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多