【问题标题】:Pandas: Convert DataFrame to Mean and Standard Deviation of Each CellPandas:将 DataFrame 转换为每个单元格的均值和标准差
【发布时间】:2015-10-24 21:27:59
【问题描述】:

我有一个非常规的 DataFrame(从 csv 读取)。它看起来像这样:

SubjAns    a1      a2     demog
S1A1       "1,2,3" "4,6"      A
S1A2       "101,1" NaN        B

对于每个单元格,我首先需要将字符串转换为浮点数列表(熊猫有没有办法将其读取为浮点数列表而不是字符串?)然后我想创建一个新的由均值和标准差组成的DataFrame:

SubjAns    a1_mean  a1_stdev a2_mean a2_stdev  demog
S1A1       3.0      1        5.0     1.41      A
S1A2       51.0     70.71    NaN     NaN       B

这可能吗?我最终会将它读入 scikit-learn,所以如果有任何方法更适合它,请包含它。

【问题讨论】:

    标签: python csv pandas scikit-learn dataframe


    【解决方案1】:

    一种方法,是编写一个小型的 parse-then-stat 函数

    In [270]: df
    Out[270]:
      SubjAns     a1   a2 demog
    0    S1A1  1,2,3  4,6     A
    1    S1A2  101,1  NaN     B 
    

    这会创建一个浮点列表,然后是 numpy 数组并返回均值和标准值

    In [271]: def split_stat(x):
       .....:     x = pd.np.array(list(map(float, str(x).split(','))))
       .....:     return x.mean(), x.std()
       .....:
    

    然后您可以迭代感兴趣的列,在本例中为 a1、a2,然后将结果压缩回新列。

    In [272]: for col in ['a1', 'a2']:
       .....:     df[col+'_mean'], df[col+'_std'] = zip(*df[col].apply(split_stat))
       .....:
    

    而且,输出应该是这样的

    In [273]: df
    Out[273]:
      SubjAns     a1   a2 demog  a1_mean     a1_std  a2_mean  a2_std
    0    S1A1  1,2,3  4,6     A        2   0.816497        5       1
    1    S1A2  101,1  NaN     B       51  50.000000      NaN     NaN
    

    【讨论】:

    • 问题是split_stat() 中的x = pd.np.array(map(float, str(x).split(','))) 似乎在创建一个地图对象,而不是一个numpy 数组。
    • @Adam_G:在 Python3 中,map 返回一个地图对象,而不是一个列表。所以使用x = pd.np.array(list(map(float, str(x).split(','))))
    • 是的,做到了。谢谢。
    猜你喜欢
    • 2017-01-31
    • 2021-09-06
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2020-10-14
    • 2016-08-22
    相关资源
    最近更新 更多