如何快速填写大量数据大熊猫?

时间:2015-12-02 13:46:51

标签: python pandas vectorization

我有两个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)

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

1 个答案:

答案 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。这取决于指数。