【发布时间】:2021-02-09 04:14:46
【问题描述】:
我有包含数据的 Excel 电子表格,每年一份。唉,这些列在一年中略有变化。我想要的是拥有一个包含所有数据的数据框,并用预定义的数据填充缺少的列。我编写了一个小示例程序来测试它。
import numpy as np
import pandas as pd
# Initialize three dataframes
df1 = pd.DataFrame([[1,2], [11,22],[111,222]], columns=['een', 'twee'])
df2 = pd.DataFrame([[3,4], [33,44],[333,444]], columns=['een', 'drie'])
df3 = pd.DataFrame([[5,6], [55,66],[555,666]], columns=['twee', 'vier'])
# Store these in a dictionary and print for verification
d = {'df1': df1, 'df2': df2, 'df3': df3}
for key in d:
print(d[key])
print()
# Create a list of all columns, as order is relevant a Set is not used
cols = []
# Count total number of rows
nrows = 0
# Loop thru each dataframe to determine total number of rows and columns
for key in d:
df = d[key]
nrows += len(df)
for col in df.columns:
if col not in cols:
cols += [col]
# Create total dataframe, fill with default (zeros)
data = pd.DataFrame(np.zeros((nrows, len(cols))), columns=cols)
# Assign dataframe to each slice
c = 0
for key in d:
data.loc[c:c+len(d[key])-1, d[key].columns] = d[key]
c += len(d[key])
print(data)
数据帧已初始化,但分配给数据数据帧的切片有些奇怪。我想要(和期望)的是:
een twee drie vier
0 1.0 2.0 0.0 0.0
1 11.0 22.0 0.0 0.0
2 111.0 222.0 0.0 0.0
3 3.0 0.0 4.0 0.0
4 33.0 0.0 44.0 0.0
5 333.0 0.0 444.0 0.0
6 0.0 5.0 0.0 6.0
7 0.0 55.0 0.0 66.0
8 0.0 555.0 0.0 666.0
但这就是我得到的:
een twee drie vier
0 1.0 2.0 0.0 0.0
1 11.0 22.0 0.0 0.0
2 111.0 222.0 0.0 0.0
3 NaN 0.0 NaN 0.0
4 NaN 0.0 NaN 0.0
5 NaN 0.0 NaN 0.0
6 0.0 NaN 0.0 NaN
7 0.0 NaN 0.0 NaN
8 0.0 NaN 0.0 NaN
第一个数据框的位置和数据已正确分配。但是,第二个数据帧被分配到正确的位置,而不是其内容:而是分配了 NaN。第三个数据帧也会发生这种情况:位置正确但数据丢失。我尝试assign d[key].loc[0:2, d[key].columns 和一些更奇特的数据切片解决方案,但都返回 NaN。如何获取数据框的内容以及分配给数据?
【问题讨论】:
-
您的预期输出是什么?你能把它包括在你的问题中吗?
pd.concat([df1, df2, df3])不解决还是pd.concat([df1, df2, df3]).fillna(0)? -
有时 Pandas 是多么简单:-)。你的建议给了我我想要的东西。看来我正在编写自己的 pandas.concat。非常感谢。让它成为答案,我会将其标记为正确答案。除此之外:我仍然不明白为什么我的解决方案不起作用。
标签: python pandas dataframe slice