【问题标题】:Retrieve maximum value from each cell containing list of tuples in a dataframe从包含数据框中元组列表的每个单元格中检索最大值
【发布时间】:2017-03-25 14:19:22
【问题描述】:

我有一个包含整数和字符串的 pandas 数据框 df[lists],它具有以下格式:

0 [(a,b,89), (a,y,992), (a,t, 99), (a,m, 1028)]
1 [(b,u,855), (b,tt,934), (b, g, 69)]
2 [(c,k, 546),(c,gf,134), (c, dd, 569)]
3 [(d,zv, 546),(d,gyr,8834), (d, dds, 5693), (d, ddd, 3459)]

实际上字符a、b、tt等更长,用于计算汉明距离 我想要得到的是每一行的最大值并将其写为 df[max]:

0 [1028]
1 [934]
2 [569]
3 [8834]

我通过以下方式到达这里:

combined = ((x, y, (5x - 3y) for x, y in combinations(df['elements'], if x != y) 
series = Series(list(g) for k, g in groupby(combined, key=itemgetter(0)))
series = df[lists]

当我使用时:

from operator import itemgetter

df['lst'].apply(lambda x: [max(x, key=itemgetter(2))[-1]])

我收到以下错误:

Traceback (most recent call last):
  File "C:\Users\Desktop\phash\dene_2.py", line 78, in <module>
    df['similarity'].apply(lambda x: [max(x, key=itemgetter(2))[-1]])
  File "C:\Users\AppData\Local\Programs\Python\Python35\lib\site-packages\pandas\core\series.py", line 2294, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas\src\inference.pyx", line 1207, in pandas.lib.map_infer (pandas\lib.c:66124)
  File "C:\Users\Desktop\phash\dene_2.py", line 78, in <lambda>
    df['similarity'].apply(lambda x: [max(x, key=itemgetter(2))[-1]])
TypeError: 'float' object is not iterable

【问题讨论】:

  • 我建议你需要改进你的数据结构。这种类型的结构很难使用。
  • 我怎么能这样做?我通过以下方式得到了结果 combine = ((x, y, (5x - 3y) for x, y in combination(df['elements'], if x != y) series = Series(list(g) for k , g in groupby(combined, key=itemgetter(0))) series = df[list]

标签: python list pandas max


【解决方案1】:

您最好的选择是使用不那么快的apply 变体。假设包含list 单元格的列名由"lst" 表示,您可以获取元组列表中的每三个元素,并通过比较它们找到最大值。然后从计算出的tuple中,选择它的最后一个元素并将其转换为单个项目list

from operator import itemgetter

df['lst'].apply(lambda t: [max(t, key=itemgetter(2))[-1]])

0    [1028]
1     [934]
2     [569]
3    [8834]
Name: lst, dtype: object

使用的数据:

df = pd.DataFrame(dict(lst=[[('a','b', 89), ('a','y', 992), ('a','t', 99), ('a','m', 1028)], 
                            [('b','u', 855), ('b','tt', 934), ('b', 'g', 69)],
                            [('c','k', 546),('c','gf', 134), ('c', 'dd', 569)], 
                            [('d','zv', 546),('d','gyr', 8834), ('d', 'dds', 5693), ('d', 'ddd', 3459)]]))

编辑:

由于可能存在被映射为float 对象的缺失值,因此您可以根据单元格的类型过滤单元格并对它们执行迭代并保持其他单元格不变:

df['lst'].apply(lambda t: [max(t, key=itemgetter(2))[-1] if isinstance(t, list) else t])

【讨论】:

  • 我得到 'float' object is not iterable 错误:/ 它让我抓狂我试图解决同样的问题 5-6 小时
  • 您可以通过附加完整的回溯来编辑您的问题吗?
  • 不,我希望您完整地附上您在'float' object is not iterable ... 之前遇到的错误。以防万一,我将编辑我的帖子,向您展示用于得出结果的数据框。
  • 好的,你能做一个简单的 - df['similarity'].apply(lambda t: [i[2] for i in t]) 并检查它是否正常工作吗?
  • 你确定所有的行都是一样的。更准确地说,它们是否都具有类似于 元组列表 的形式?如果甚至有一个类型为float 的单元格(可以是nan 或任何浮点数),那么在这种情况下就会出现这样的错误。试试 - df['similarity'].map(type).value_counts() 看看你是否以某种方式获得了一个浮动实例。
猜你喜欢
  • 2018-10-27
  • 2020-01-18
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多