gpt4 book ai didi

python - 如何使用 pandas fillna 快速填写大量数据?

转载 作者:太空狗 更新时间:2023-10-30 01:33:19 28 4
gpt4 key购买 nike

我有两个 Dataframes,一个很大,有很多缺失值,第二个有数据来填充第一个中缺失的数据。

数据框示例:

In[34]:
import pandas as pd
import numpy as np

df2 = pd.DataFrame({'A': [1, 1, 1, 2, 2, 2], 'B': [1, 0, 1, 1, 0, 0]})

df = pd.DataFrame({'A': [0, 1, 2, 3, 4, 5], 'B1': [1, np.nan, np.nan, 8, 9, 1],'B2':[1, np.nan, np.nan, 7, 6, 1], 'B3':[1, np.nan, np.nan, 8, 7, 1] })
df=df.set_index(['A'])
df2=df2.set_index(['A'])

In[35]:
df

Out[35]:
B1 B2 B3
A
0 1 1 1
1 NaN NaN NaN
2 NaN NaN NaN
3 8 7 8
4 9 6 7
5 1 1 1

In[36]:
df2

Out[36]:
B
A
1 1
1 0
1 1
2 1
2 0
2 0

所以我想做的是使用 df2 中的数据填充 df,同时考虑到在 df2 中遇到第二个实例时 B1 不是 B2。请参阅下面所需的输出:

In[38]:
df

Out[38]:
B1 B2 B3
A
0 1 1 1
1 1 0 1
2 1 0 0
3 8 7 8
4 9 6 7
5 1 1 1

1 和 2 的 B1、B2 和 B3 中的 NaN 已用 df2 中的数据填充。索引 1 为 1 0 1,索引 2 为 1 0 0。请参阅下面我低效的 for 循环实现:

In[37]:
count=1
seen=[]

for t in range(0, len(df2)):
if df2.index[t] not in seen:
count=1
seen.append(df2.index[t])
else:
count=count+1
tofill=pd.DataFrame(df2.iloc[t]).transpose()
tofill_dict={"B"+str(count):tofill.B}
df=df.fillna(value=tofill_dict)

这可行,但是当数据集变大时,可能会花费大量时间。所以我的问题是是否有办法更快地做到这一点?我听说矢量化可以工作,你会如何实现它?有没有其他方法可以更快地做到这一点?

最佳答案

首先,您不能重置 df2 的索引。

你可以试试groupby - 每个组都用 T 转置,然后是 fillna df 通过 df2 的值:

import pandas as pd
import numpy as np

df2 = pd.DataFrame({'A': [1, 1, 1, 2, 2, 2], 'B': [1, 0, 1, 1, 0, 0]})

df = pd.DataFrame({'A': [0, 1, 2, 3, 4, 5], 'B1': [1, np.nan, np.nan, 8, 9, 1],'B2':[1, np.nan, np.nan, 7, 6, 1], 'B3':[1, np.nan, np.nan, 8, 7, 1] })
df=df.set_index(['A'])
df2=df2.set_index(['A'])

print df
B1 B2 B3
A
0 1 1 1
1 NaN NaN NaN
2 NaN NaN NaN
3 8 7 8
4 9 6 7
5 1 1 1
print df2
A B
0 1 1
1 1 0
2 1 1
3 2 1
4 2 0
5 2 0
df2 = df2.groupby(df2.index).apply(lambda x: x.B.reset_index(drop=True).T)
df2.columns = df.columns
print df2
B1 B2 B3
A
1 1 0 1
2 1 0 0

df = df.fillna(df2)
print df

B1 B2 B3
A
0 1 1 1
1 1 0 1
2 1 0 0
3 8 7 8
4 9 6 7
5 1 1 1

也许如果 df = df.fillna(df2) 不起作用,可以使用 df = df.combine_first(df2)。这取决于指数。

关于python - 如何使用 pandas fillna 快速填写大量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34044331/

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