在 Pandas 数据框中将 float64 数组中的所有单元格展平为 int

Posted

技术标签:

【中文标题】在 Pandas 数据框中将 float64 数组中的所有单元格展平为 int【英文标题】:Flatten all cells from float64 arrays to int in a Pandas dataframe 【发布时间】: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,我已经添加了输出。 【参考方案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 不错

以上是关于在 Pandas 数据框中将 float64 数组中的所有单元格展平为 int的主要内容,如果未能解决你的问题,请参考以下文章

Python:打印 Pandas 数据框返回 numpy.ndarray 属性错误

如何在python中将字符串转换为pandas数据框[重复]

为啥 Pandas 将我的 numpy float32 强制转换为 float64?

在Python DataFrame中将字符串转换为float64 [重复]

pandas 比较引发 TypeError:无法将 dtyped [float64] 数组与 [bool] 类型的标量进行比较

根据列名删除 Pandas 数据框列