【问题标题】:How to count the number of items (or length) of cell in pandas dataframe?如何计算熊猫数据框中单元格的项目数(或长度)?
【发布时间】:2017-08-01 05:25:16
【问题描述】:

在这个小数据框中:

d1 = pd.read_csv('to_count.mcve.txt', sep='\t')

      M1          M2          F1 
      A,B,A,C,D   A,C,B,C,B   A 
      A,B,B,C,B   A,B,A       B 
      C,B,C,D,E   B,C         E 

步骤 01:

我要数F1中有多少个值在M1和M2中

我能做到:

d1_count = d1.apply(lambda x: x.loc[::].str.count(x.F1), 1)

输出:

        M1  M2  F1              
        2   1   1  
        3   1   1 
        1   0   1 

步骤 02: 但如果原始单元格的长度超过 3(不包括逗号),我想将计数除以 2。

解释:

  • M1 中的所有值的长度都大于 3,第一个 M2 的长度大于 3。因此,需要更改这些值的计数(除以 2)。

  • M1中的第一个值为A,B,A,C,D

  • F1 值为A,M1 中有 2 个“A”,使用.str.count(x.F1) 计数
  • 因为A,B,A,C,D的长度大于3。我现在改变计数(除以2),得到1。
  • 我想自动为所有列执行此操作,因为会有很多列。

最终的预期输出是:

     M1     M2                   
     1     0.5
     1.5   1
     0.5   0

任何建议。

【问题讨论】:

  • 什么是“单元格”,它的“长度”是多少?
  • 你可以使用 sum...
  • 熊猫数据框中的每个单元格都是columns and rows 的交集。第一个单元格是数据A,B,A,C,D
  • "cell" 不是标准术语,我知道您的意思,但如果您准确,它会有所帮助。你在做什么,字符串? “长度”是什么意思?字符串长度?或字符串中的字母数,不包括逗号?
  • @WillemVanOnsem:你能建议怎么做吗?我可以计算每个单元格的长度,但这不是我想要的。我想:计算M1 and M2F1 的值的数量,但如果M1 and M2 的原始长度超过一定长度,我想将该计数除以2。

标签: python pandas count apply string-length


【解决方案1】:

看起来M1 列中的“单元格”是用逗号分隔的字符串。首先将其转换为列表而不是字符串可能更容易,因此您的操作是有意义的。像这样的:

df['M1_list'] = df['M1'].apply(lambda x: x.split(","))

现在您有一个名为M1_list 的列,其中每个条目都有一个列表。现在您可以再次使用.apply() 来获取您想要的号码。

df['F1_count'] = df.apply(lambda x: x['M1_list'].count(x['F1']), axis=1)

但这只会为您提供M1_list 中来自F1 的项目数。要获得“如果您有超过 3 个项目将计数除以 2”的条件,您可以执行另一个 .apply:

df['F1_count'] = df.apply(lambda x: x['F1_count'] / 2 if len(x['M1']) >= 3 else x['F1_count'], axis=1)

如果需要,您当然可以将它们组合成一个 .apply 语句。但是,如果您拆分复杂的操作,它会使代码更易于阅读。您可以将其结合起来的一种方法是使用辅助功能,而不是使用lambda

def compute_F1(row):
    M1_list = row['M1'].split(",")
    f1_count = M1_list.count(row['F1'])
    if (len(M1_list) >= 3):
        return f1_count / 2
    else:
        return f1_count

然后将该函数应用于每一行:

df['F1_count'] = df.apply(lambda x: compute_F1(x), axis=1)

你应该得到你的结果。

【讨论】:

  • 感谢您的回答。但是,我正在尝试将其应用于有很多列的数据。所以,我不想指定特定的列(如df['M1'])。我尝试使用 df[::] 和其他几种方法来解决它,但无法完成。任何建议。
  • 你可以只写一个for循环来循环所有的列。为了将来参考,如果这样的事情对您的解决方案很重要,您应该在原始帖子中提及它。
  • 是的,我的错。实际上,我可以使用 df_count = df.apply(lambda x: x.loc[::].str.count(x.F1), 1) 对所有列进行计数,但我不能只插入条件。尝试了applymap,然后变得最糟糕。我在这里拉头发,哈哈?
  • 如果你没有使用我的建议,我真的帮不了你……你真的应该先把它改成一个列表
  • 我认为你的意思是问题。我会改的
猜你喜欢
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多