gpt4 book ai didi

python - Pandas:高效地将一行拆分为多行

转载 作者:太空宇宙 更新时间:2023-11-03 11:24:04 27 4
gpt4 key购买 nike

我目前面临的问题是采用 pandas DataFrame 并有效地获取每条记录并将其按以下方式分解为多条记录:

输入:

In [16]: pd.DataFrame({'Name': 'Person1', 'State': 'Indiana', 'Money1': 100.42, 'Money2':54.54, 'Money3': 23.45}, index=[1])
Out[16]:
Money1 Money2 Money3 Name State
1 100.42 54.54 23.45 Person1 Indiana

输出:

   Money1  Money2  Money3  Name     State
1 100.42 np.nan np.nan Person1 Indiana
2 np.nan 54.54 np.nan Person1 Indiana
3 np.nan np.nan 23.45 Person1 Indiana

本质上,问题是将原始记录拆分为 x 条记录,其中 x 是要拆分的传入列的列表(在本例中为“Money1”、“Money2”、“Money3”。我尝试通过创建DataFrames 并连接它们,但这非常慢且内存效率低下。

编辑1:

请注意,即使您的静态列之一(已转换为多索引的列)充满了 NaN,答案也不起作用。这是 Pandas 中报告的错误: https://github.com/pydata/pandas/issues/6322

要绕过它,请使用 fillnareplace 将完全由 NaN 组成的列填充为空字符串 '',例如,然后在此过程之后,将 NaN 放回。

最佳答案

这应该适用于具有任意列数的数据框。

df = pd.DataFrame({'Name': ['Person1', 'Person2'], 
'State': ['Indiana', 'NY'],
'Money1': [100.42, 200],
'Money2': [54.54, 25],
'Money3': [23.45, 10]})

index_cols = ['Name', 'State']
cols = [c for c in df if c not in index_cols]

df2 = df.set_index(index_cols).stack().reset_index(level=2, drop=True).to_frame('Value')

df2 = pd.concat([pd.Series([v if i % len(cols) == n else np.nan
for i, v in enumerate(df2.Value)], name=col)
for n, col in enumerate(cols)], axis=1).set_index(df2.index)

>>> df2.reset_index()
Name State Money1 Money2 Money3
0 Person1 Indiana 1 NaN NaN
1 Person1 Indiana NaN 55 NaN
2 Person1 Indiana NaN NaN 23
3 Person2 NY 2 NaN NaN
4 Person2 NY NaN 25 NaN
5 Person2 NY NaN NaN 10

关于python - Pandas:高效地将一行拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37198847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com