2015-12-02 70 views
4

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

所以我想要做的是填补了DF利用DF2也考虑到B1在DF2跨二审何时到来并不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 

的NaN的在B1,B2和B3为1和2已被填充有从DF2的数据。 1 0 1索引1和1 0 0指数2 见下面我低效循环执行:

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

首先你不能重置df2的索引。

你可以使用try groupby - 各组与T换位,然后fillnadf通过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)。这取决于指数。

+0

它是如何工作的?我无法与您的解决方案进行比较,因为错误:'NameError:全局名称'toappend'未定义' – jezrael

+0

感谢您的回答jezrael!我解决了错误的原因,我很抱歉。我已经快速检查过了,它在使用'df2 = df2.groupby(df2.index).apply(lambda x:xBreset_index(drop = True).T)'而不是'df2 = df2.groupby('A' ).apply(lambda x:xBreset_index(drop = True).T)'。当我回家时需要在大数据集上进行测试 – HBX

+0

好的,你是对的,但我认为你只为这个填充重置索引。所以我想删除这个操作。我编辑答案。 – jezrael