【问题标题】:Each item in DataFrame column is list of different dimension - how to proceed?DataFrame 列中的每个项目都是不同维度的列表 - 如何进行?
【发布时间】:2014-10-22 17:36:07
【问题描述】:

我的问题与Converting a list of ints, tuples into an numpy array 类似,但不同之处在于每个项目的格式不一定是 [float, (float, float, float)] 但第一个是 [float, float] 下一个是 [float,浮动,浮动]等。

我的 DataFrame 中的数据是通过查询 mySQL 数据库获得的,如果这很重要的话。 “值”列最初由“1,2”和“1,2,3”和“1,2,3,4,5”等格式的字符串填充。 DataFrame 现在看起来大致如下:

ID       values            num
1        [1, 2]             2
2        [1, 2, 3]          3
3        [1, 2, 3, 4, 5]    5

我想要做的是能够从 DataFrame 中获取每个 [float, float, ...] 条目,并将基于它的新值/变量报告给附加到同一 DataFrame 的新列,例如计算每个“values”列表或新变量“avg = sum(values)/num”的标准差,并将结果存储在 df_new['stddev'] 或 df_new['avg'] 中。

这是我目前关注的代码部分:

df_new = df[df.num <= 10]
df_new['values'] = df_new['values'].astype(str).str.split(',')
valList = df_new.values.tolist()

我对 Python 比较陌生,所以如果我错过了一些基本的东西,请多多包涵。

【问题讨论】:

    标签: python mysql numpy pandas


    【解决方案1】:
    df_new = df[df.num <= 10]
    df_new['values'] = df_new['values'].str.split(',').apply(lambda x: map(float, x))
    df_new['avg'] = df_new['values'].apply(np.mean)
    df_new['stddev'] = df_new['values'].apply(np.std)
    

    产量

       ID           values  num  avg    stddev
    0   1           [1, 2]    2  1.5  0.500000
    1   2        [1, 2, 3]    3  2.0  0.816497
    2   3  [1, 2, 3, 4, 5]    5  3.0  1.414214
    

    【讨论】:

    • 我试过了,代码很有意义,但是我收到一个错误“无法使用灵活类型执行 reduce” - 我是否必须手动将每个列表转换为数组或类似的东西?
    • 我尝试使用 for 循环,但收到相同的错误:for row in df_new_new['editPercents']: eP_mean = np.mean(row) df_new_new['eP_mean'] = eP_mean
    • 哦,我明白了。问题是由于valuesstrings 列表而不是浮点列表。一个快速的补丁是定义df_new['values'] = df_new['values'].str.split(',').apply(lambda x: map(float, x))。但实际上,这只是贴在更大问题上的创可贴。您不应该使用逗号分隔的数字列表来形成 DataFrame。如果这是将数据存储在数据库中的方式,则需要修复数据库。它应该将数字存储为数字,而不是字符串。
    • 另外,将 Python 列表存储在 Pandas 列中的效率非常低。如果您扩展 DataFrame 中的行数,以便每个值都有自己的行,您将获得更好的性能。理想情况下,您希望将数据从数据库中提取到此 DataFrame 中,从而完全避免您当前面临的问题。然后可以使用df.groupby(['ID'])['val'].agg(['mean','std']) 计算您要查找的值。
    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2014-10-17
    • 2023-03-27
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多