【问题标题】:Flatten all cells from float64 arrays to int in a Pandas dataframe在 Pandas 数据框中将 float64 数组中的所有单元格展平为 int
【发布时间】:2021-08-07 03:47:42
【问题描述】:

我有一个 6 行 11 列的 Pandas DataFrame,其中包含一个 float64 数组,每个单元格中有一个值。数据框中的单元格如下所示:

这是我将数据框转换为字典后得到的结果:

{'AO': {"W": [-0.09898120815033484],
 "X": [0.025084149326805416],
 "Y": [-0.043670609717370634],
 "Z": [-0.07389705882352943],
 "A": [-0.018586460390565218],
 "B": [-0.11756766854090006]},
'DR': {"W": [0.8163265306122449],
 "X": [1.0814940577249577],
 "Y": [0.8759551706571573],
 "Z": [0.8828522920203735],
 "A": [0.9473403118991668],
 "B": [0.7733390301217689]},
'DP': {"W": [-0.14516129032258063],
 "X": [0.05955334987593053],
 "Y": [-0.10348491287717809],
 "Z": [-0.0856079404466501],
 "A": [-0.043931563001247564],
 "B": [-0.1890928533238282]},
'PD': {"W": [-0.1255102040816326],
 "X": [0.09129967776584313],
 "Y": [-0.13698152666434293],
 "Z": [-0.03421052631578947],
 "A": [-0.0456818488984998],
 "B": [-0.1711920529801324]}}

每行的索引是 W、X、Y、Z、A 和 B。我想摆脱每个单元格中的所有 numpy 数组结构并将这个 DataFrame 展平,以便我只能拥有 int /float 每个单元格中的值。我该怎么做?

【问题讨论】:

  • 不要发布图片。而是发布实际的数据帧(或字典)。
  • 谢谢@Nk03,我已经添加了输出。

标签: pandas dataframe numpy scikit-learn sklearn-pandas


【解决方案1】:

试一试:

from itertools import chain
df  = pd.DataFrame([list(chain(*i)) for i in df.values], index= df.index, columns= df.columns)

【讨论】:

    【解决方案2】:

    使用applymap:

    df = df.applymap(lambda x: x[0])
    

    df:

             AO        DR        DP        PD
    W -0.098981  0.816327 -0.145161 -0.125510
    X  0.025084  1.081494  0.059553  0.091300
    Y -0.043671  0.875955 -0.103485 -0.136982
    Z -0.073897  0.882852 -0.085608 -0.034211
    A -0.018586  0.947340 -0.043932 -0.045682
    B -0.117568  0.773339 -0.189093 -0.171192
    

    通过 perfplot 的时间信息:

    from itertools import chain
    
    import numpy as np
    import pandas as pd
    import perfplot
    
    np.random.seed(5)
    
    
    def gen_data(n):
        return pd.DataFrame(np.random.random(size=(n, 4)),
                            columns=['AO', 'DR', 'DP', 'PD']) \
            .applymap(lambda x: np.array([x]))
    
    
    def chain_comprehension(df):
        return pd.DataFrame([list(chain(*i)) for i in df.values], index=df.index,
                            columns=df.columns)
    
    
    def apply_map(df):
        return df.applymap(lambda x: x[0])
    
    
    if __name__ == '__main__':
        out = perfplot.bench(
            setup=gen_data,
            kernels=[
                chain_comprehension,
                apply_map
            ],
            labels=[
                'chain_comprehension',
                'apply_map'
            ],
            n_range=[2 ** k for k in range(25)],
            equality_check=None
        )
        out.save('perfplot_results.png', transparent=False)
    

    【讨论】:

    • Applymap 不错
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2018-05-19
    • 1970-01-01
    • 2017-04-22
    • 2014-10-15
    • 2016-08-24
    • 2020-07-20
    • 2018-08-13
    相关资源
    最近更新 更多