pandas 从具有字典列表的DataFrame创建DataFrame

apeeds0o  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(86)

我试图获取输出DataFrame,但无法决定解包数据并转换为DataFrame的方法。
输入 Dataframe

stats
[{'city':None, 'last_time': 1234567}]
[]
[{'city':'Seattle', 'last_time': 45678999876}]

字符串
预期输出

city       last_time
None       1234567
NA         NA
Seattle    45678999876


已尝试代码

data = pd.DataFrame(Data)
data = pd.DataFrame(data["stats"])


对此,任何指导/帮助都将不胜感激。

xghobddn

xghobddn1#

你的构造失败是因为NaN s。
以下是str/Series的可能修复:

out = df["stats"].str[0].apply(pd.Series).drop(0, axis=1)

字符串
或者这个:

stats = df["stats"].str[0]
templ = dict.fromkeys(["city", "last_time"])

out = stats.where(stats.notnull(), templ).apply(pd.Series)


输出量:

print(out)

      city      last_time
0      NaN     1234567.00
1     None            NaN
2  Seattle 45678999876.00

[3 rows x 2 columns]


使用的输入:

df = pd.DataFrame(
    {
        "stats": [
            [{"city": None, "last_time": 1234567}],
            [],
            [{"city": "Seattle", "last_time": 45678999876}]]
    }
)

ffx8fchx

ffx8fchx2#

如果这是你想要的答案:

输入框

df = pd.DataFrame(data = [[{'city':None, 'last_time': 1234567}],
                          [],
                          [{'city':'Seattle', 'last_time': 45678999876}]])
df
                                               0
0           {'city': None, 'last_time': 1234567}
1                                           None
2  {'city': 'Seattle', 'last_time': 45678999876}

字符串

分解为列

df[0].apply(pd.Series)

      city     last_time
0      NaN  1.234567e+06
1      NaN           NaN
2  Seattle  4.567900e+10


则它是Split / Explode a column of dictionaries into separate columns with pandas的副本

rdlzhqv9

rdlzhqv93#

像这样试试

import pandas as pd

data = {
    "stats": [
        [{'city': None, 'last_time': 1234567}],
        [],
        [{'city': 'Seattle', 'last_time': 45678999876}]
    ]
}

df = pd.DataFrame(data)

output_data = []

for row in df['stats']:
    if not row:
        output_data.append({'city': 'NA', 'last_time': 'NA'})
    else:
        output_data.append({'city': row[0]['city'], 'last_time': row[0]['last_time']})
output_df = pd.DataFrame(output_data)
print(output_df)

字符串
输出量:

city    last_time
0     None      1234567
1       NA           NA
2  Seattle  45678999876

ikfrs5lh

ikfrs5lh4#

使用explodepd.json_normalize

>>> pd.json_normalize(df['stats'].explode())

      city     last_time
0     None  1.234567e+06
1      NaN           NaN
2  Seattle  4.567900e+10

字符串
apply(pd.Series)可以很慢:

>>> %timeit pd.json_normalize(df['stats'].explode())
269 µs ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

>>> %timeit df["stats"].str[0].apply(pd.Series)
959 µs ± 5.79 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)


输入数据与@Timeless相同

相关问题