我有两个Dataframe,一个是大型的,有很多缺失值,另一个是数据,用于填充第一个缺失的数据。
数据框示例:
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
B1和B2中的1和2中的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)
这样可行,但是当数据集变大时,可能会花费大量时间。所以我的问题是,有没有办法更快地做到这一点? 我听说矢量化可以工作,你会如何实现?有没有其他方法可以更快地完成这项工作?
答案 0 :(得分:1)
首先,您无法重置df2
的索引。
您可以使用try groupby
- 每个组都使用T
进行转置,然后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)
无效,可以使用int
。这取决于指数。