Python 如何计算数据帧中单元格的项数(或长度)?

Python 如何计算数据帧中单元格的项数(或长度)?,python,pandas,count,apply,string-length,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 步骤01: d1 = pd.read_csv('to_count.mcve.txt', sep='\t')

在这个小数据帧中:

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:

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 
我想计算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\u列表中
F1
中的项目数。要获得“如果您有3个以上的项目,请将计数除以2”的条件,您可以执行另一个
。应用

df['F1_count'] = df.apply(lambda x: x['F1_count'] / 2 if len(x['M1']) >= 3 else x['F1_count'], axis=1)
当然,您可以将它们组合成一个
。如果需要,可以应用
语句。但是,如果您拆分复杂的操作,则代码更易于阅读。您可以将其与辅助功能结合使用,而不是使用
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)

你应该有你的结果。

什么是“单元格”,它的“长度”是多少?你可以使用一个和…数据框中的每个单元格都是
列和行的交点。第一个单元格包含数据
A、B、A、C、D
“单元格”不是标准术语,我知道你的意思,但如果你准确的话,它会有所帮助。你在用什么,弦?你说的“长度”是什么意思?绳子的长度?或者字符串中的字母数,不包括逗号?@WillemVanOnsem:你能建议怎么做吗?我可以计算每个单元格的长度,但这不是我想要的。我想:计算
M1和M2
F1
的值的数量,但是如果
M1和M2
的原始长度超过一定长度,我想将该计数除以2。谢谢您的回答。但是,我正试图将这一点应用到我的数据中,因为其中有很多列。因此,我不想指定特定的列(比如
df['M1']
)。我试着用df[:]和其他几种方法来解决这个问题,但没有成功。任何建议。你可以写一个for循环来循环所有列。作为将来的参考,如果这类事情对你的解决方案很重要,你应该在你的原始帖子中提及。是的,我的错。实际上,我可以使用df_count=df.apply(lambda x:x.loc[:].str.count(x.F1),1)对所有列进行计数,但我不能只插入条件。尝试了applymap,结果变得最糟糕。我在这里开玩笑,哈哈,如果你不使用我的建议,我真的帮不了你。。。你真的应该先把它改成一个列表我想你的意思是问题。我会换的