【问题标题】:Extract unique values from pandas frame per row and add them to a new column从每行的熊猫数据框中提取唯一值并将它们添加到新列
【发布时间】:2020-06-22 17:20:36
【问题描述】:

我想解决以下问题:

假设我有一个看起来像这样的数据帧

match              0              1              2        3    4    5    6    7
1           Morocco         France           Morocco      NaN  NaN  NaN  NaN  NaN
2           Morocco         France           Morocco      NaN  NaN  NaN  NaN  NaN
3           Morocco         France           NaN          NaN  NaN  NaN  NaN  NaN
4           China           United States    NaN          NaN  NaN  NaN  NaN  NaN
5           China           NaN              NaN          NaN  NaN  NaN  NaN  NaN

我正在寻找一种方法来查找每行中的唯一值并将它们添加到另一列,同时删除所有 NaN。

输出应如下所示:

match       8
1           Morocco, France
2           Morocco, France
3           Morocco, France
4           China, United States
5           China

关于如何解决这个问题的任何建议?

【问题讨论】:

  • 到底是什么问题?你有没有尝试过,做过任何研究? Stack Overflow 不是免费的代码编写服务。请参阅:tourHow to Askhelp centermeta.stackoverflow.com/questions/261592/…。您甚至还没有以某种便于使用的格式共享数据。那个DataFrame首先来自哪里?有没有办法正确创建/预先更改它?
  • 我做了一些研究,但没有找到任何有希望的结果来解决这类问题,因为我决定问这个问题。当然这个问题可以被批准,但是从给出的答案的数量来看,这个问题似乎是完全可以理解的,没有包含不必要的信息
  • 没有为这类问题找到任何有希望的结果 stackoverflow.com/questions/19377969/…, stackoverflow.com/questions/33158417/….

标签: python pandas


【解决方案1】:

用途:

cols = df.columns[df.columns.str.isnumeric()]
#or selecting columns
#cols = df.columns[1:]
#cols = df.columns.difference(['match'])
df[int(cols[-1])+1]=df[cols].agg(lambda x: ', '.join(set(x.dropna())),axis=1)
#for string type
#df[f'{int(cols[-1])+1}']=df[cols].stack().groupby(level=0).agg(', '.join)
df = df.reindex(columns = df.columns.difference(cols))
print(df)

                      8  match
0       France, Morocco      1
1       France, Morocco      2
2       France, Morocco      3
3  China, United_States      4
4                 China      5

我们也可以使用:

df[int(cols[-1])+1] = (df[cols].stack()
                               .groupby(level=0)
                               .agg(lambda x: ', '.join(set(x)),axis=1))

【讨论】:

    【解决方案2】:
    # Convert each column dtype to str: x.astype(str)
    # Null dtype became 'nan' so remove it: replace('nan', "")
    # Concatenate each row entry: sum()
    # Convert it to set to delete duplicate entries 
    # Convert it to list to concatenate with "," as a string
    
    df_new = df.apply(lambda x: ",".join(list(set(((x.astype(str)).sum()).replace('nan', "")))), axis=1)
    
    
    

    【讨论】:

    • 我测试了你的回答并修改为df_new = df.apply(lambda x: ", ".join(list(set(x.dropna().astype(str)))), axis=1)以获得想要的结果
    【解决方案3】:

    这是在lambda 中组合setlist 的尝试:

    df_ex[8] = [x for x in df_ex[[0,1,2,3,4,5,6,7]].values.tolist()]
    df_ex[8] = df_ex[8].apply(lambda x: list(set([y for y in x if str(y)!='nan'])))
    

    输出:

    0         [Morocco, France]
    1         [Morocco, France]
    2         [Morocco, France]
    3    [United States, China]
    4                   [China]
    

    【讨论】:

      【解决方案4】:

      还有很长的路要走

      dee = dict(tuple(df.groupby('Match')))
      tmp = []
      tmp2 = []
      for k,v in dee.items():
      
          tmp.append(k)
      
          for i in v.columns.tolist():
              tmp3 = []
              #print(i)
              tmp3.append(str(v[i]))
          tmp2.append(tmp3)
      new = pd.DataFrame({'Match':tmp,'List':tmp2})
      

      【讨论】:

      • 我认为你绝对不想要嵌套循环!
      • 我经常听到这个,我认为这是由于记忆和时间?开发人员不经常使用嵌套循环吗?我使用 27000 行 x 26 列数据集对该版本的代码进行了时间检查。耗时 1.34 秒。将与其他发布的方法之一进行比较。
      • 这并不是说它本身就是邪恶的,而是对这个问题的一个完全有效的答案。如果有更好的解决方案,更应该避免它。特别是在像 stackoverflow 这样的网站上,它的目的是作为一个知识库,而不是一个代码帮助服务。考虑一个案例,有人在明年遇到类似情况并找到这个问题。只有他们的数据集是 27,000,000 行和 500 列,并且他们的业务有处理时间要求。现在,在较小数据上花费 2 毫秒和 50 毫秒的矢量化方法看起来越来越受欢迎。
      • @G.Anderson 我尝试了用户伊莎贝拉发布的答案。在我的机器上,我的方法得到了更快的时间,是否存在一种方法比另一种更好的范围?可以制作一个有趣的博客页面` 1.17 s ± 182 ms 每个循环(平均值 ± 7 次运行的标准偏差,每个循环 1 个循环)每个循环 4.69 秒 ± 174 毫秒(平均 ± 7 次运行的标准偏差,1 个循环每个)`
      • @G.Anderson 很有趣,谢谢你的洞察力,关于这个 python 的东西肯定有很多东西要学
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 2015-01-30
      相关资源
      最近更新 更多