【问题标题】:How to count number of unique values in pandas while each cell includes list如何在每个单元格包含列表时计算熊猫中唯一值的数量
【发布时间】:2021-01-24 21:49:26
【问题描述】:

我有一个这样的数据框:

将熊猫导入为 pd 将 numpy 导入为 np

Out[10]: 
       samples  subject  trial_num
0    [0 2 2        1          1
1    [3 3 0        1          2
2    [1 1 1        1          3
3    [0 1 2        2          1
4    [4 5 6        2          2
5    [0 8 8        2          3

我想要这样的输出:

       samples  subject  trial_num   frequency
0    [0 2 2        1          1      2    
1    [3 3 0        1          2      2
2    [1 1 1        1          3      1
3    [0 1 2        2          1      3
4    [4 5 6        2          2      3
5    [0 8 8        2          3      2

这里的频率是每个样本中每个列表中唯一值的数量。例如,[0, 2, 2] 只有一个唯一值。

我可以在没有列表的情况下在 pandas 中执行唯一值,或者使用 for 循环来实现它以遍历每一行访问每个列表和....但我想要一种更好的 pandas 方法来做到这一点。

谢谢。

【问题讨论】:

  • 为什么[0, 2, 2]只有一个唯一值而不是两个:[0,2]不一样
  • 澄清点:[0, 2, 2]2 个唯一值,02。你能澄清一下你的意思吗?
  • @It_is_Chris 你是对的,只是纠正它
  • @G.Anderson 我的错我只是纠正它

标签: python pandas dataframe


【解决方案1】:

您可以使用collections.Counter 执行任务:

from collections import Counter

df['frequency'] = df['samples'].apply(lambda x: sum(v==1 for v in Counter(x).values()))

print(df)

打印:

     samples  subject  trial_num  frequency
0  [0, 2, 2]        1          1          1
1  [3, 3, 0]        1          2          1
2  [1, 1, 1]        1          3          0
3  [0, 1, 2]        2          1          3
4  [4, 5, 6]        2          2          3
5  [0, 8, 8]        2          3          1

编辑:更新问题:

df['frequency'] = df['samples'].apply(lambda x: len(set(x)))

print(df)

打印:

     samples  subject  trial_num  frequency
0  [0, 2, 2]        1          1          2
1  [3, 3, 0]        1          2          2
2  [1, 1, 1]        1          3          1
3  [0, 1, 2]        2          1          3
4  [4, 5, 6]        2          2          3
5  [0, 8, 8]        2          3          2

【讨论】:

  • 非常感谢您的帮助。实际上,我刚刚更新了关于我在每个单元格中的列表没有, 的问题,在这种情况下,它的计数似乎不正确
  • @sariii 所以sample 列的值类型是string 而不是list?
  • 请给我一点时间仔细检查。
  • 很抱歉造成混淆,pandas 说它是一个对象。我再次更新了该项目的真实外观。问题是我有很多关于这方面的数据。这就是为什么我从不检查列表末尾的原因。它是这样的:[1 2 3 without even having end of ]`
  • @sariii 试试x.split() 这将列出例如['1', '2', '3']
【解决方案2】:
import pandas as pd
import ast # import for sample data creation
from io import StringIO # import for sample data creation

# sample data
s = """samples;subject;trial_num
[0, 2, 2];1;1
[3, 3, 0];1;2
[1, 1, 1];1;3
[0, 1, 2];2;1
[4, 5, 6];2;2
[0, 8, 8];2;3"""

df = pd.read_csv(StringIO(s), sep=';')
df['samples'] = df['samples'].apply(ast.literal_eval)

# convert lists to a new frame and use nunique
# assign values to a col
df['frequency'] = pd.DataFrame(df['samples'].values.tolist()).nunique(1)


     samples  subject  trial_num  frequency
0  [0, 2, 2]        1          1          2
1  [3, 3, 0]        1          2          2
2  [1, 1, 1]        1          3          1
3  [0, 1, 2]        2          1          3
4  [4, 5, 6]        2          2          3
5  [0, 8, 8]        2          3          2

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多