python - 如何计算 Pandas 数据框中单元格的项目数(或长度)?

标签 python pandas count apply string-length

在这个小数据框中:

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 

第 1 步:

我想统计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

任何建议。

最佳答案

看起来 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)

你应该得到你的结果。

关于python - 如何计算 Pandas 数据框中单元格的项目数(或长度)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42725629/

相关文章:

SQL 记录出现次数

MySQL - 在不同条件下计算两件事

python - 对填充列表的 DataFrame 的每一列应用一个函数

python - key 错误 : 'IDENTITY_ENDPOINT' error in Azure environment

python - 识别包含百分位数 numpy 矩阵中列中位数的行

python - 使用条件 cumsum 的自定义聚合

python - 按 pandas 中的数字填充组内的 NaN 值

Python Pandas : Vectorized Way of Cleaning Buy and Sell Signals

Android sqlite 选择带计数的子查询

Python simplejson.dumps 仍然返回字符串