条件连接Pandas.Dataframe

时间:2014-12-10 11:53:58

标签: python-2.7 pandas

我尝试部分加入两个数据帧:

import pandas
import numpy
entry1= pandas.datetime(2014,6,1)
entry2= pandas.datetime(2014,6,2)
df1=pandas.DataFrame(numpy.array([[1,1],[2,2],[3,3],[3,3]]), columns=['zick','zack'], index=[entry1, entry1, entry2, entry2])   
df2=pandas.DataFrame(numpy.array([[2,3],[3,3]]), columns=['eins','zwei'], index=[entry1, entry2]) 

我试过

df1 = df1[(df1['zick']>= 2) & (df1['zick'] < 4)].join(df2['eins'])  

但这不起作用。在加入df1 [&#39; eins&#39;]的值后,预计为[NaN,2,3,3]。 怎么做?我希望它没有df副本。

1 个答案:

答案 0 :(得分:1)

我认为这就是你真正想要使用的东西:

df1 = df1.join(df2['eins'])
mask = (df1['zick']>= 2) & (df1['zick'] < 4)
df1.loc[~mask, 'eins'] = np.nan
df1

得到以下特性:

            zick  zack  eins
2014-06-01     1     1   NaN
2014-06-01     2     2     2
2014-06-02     3     3     3
2014-06-02     3     3     3

您遇到的问题是您要加入过滤的数据框,而不是原始数据框,NaN没有出现的位置(每个单元格都满足您的过滤器)。

编辑:

在下面的评论中考虑新的输入,这是另一种方法。

创建一个空列,需要使用第二个数据帧中的值进行更新:

df1['eins'] = np.nan
print df1
print df2

            zick  zack  eins
2014-06-01     1     1   NaN
2014-06-01     2     2   NaN
2014-06-02     3     3   NaN
2014-06-02     3     3   NaN

            eins  zwei
2014-06-01     2     3
2014-06-02     3     3

设置过滤器并使满足过滤器的column_to_be_updated中的值等于0.

mask = (df1['zick']>= 2) & (df1['zick'] < 4)
df1.loc[(mask & (df1['eins'].isnull())), 'eins'] = 0
print df1

            zick  zack  eins
2014-06-01     1     1   NaN
2014-06-01     2     2     0
2014-06-02     3     3     0
2014-06-02     3     3     0

使用df2值更新inplace您的df1(仅更新值等于0):

df1.update(df2, filter_func=lambda x: x == 0)
print df1

            zick  zack  eins
2014-06-01     1     1   NaN
2014-06-01     2     2     2
2014-06-02     3     3     3
2014-06-02     3     3     3

现在,如果您想更改过滤器并再次执行更新,则不会更改以前更新的值:

mask = (df1['zick']>= 1) & (df1['zick'] == 1)
df1.loc[(mask & (df1['eins'].isnull())), 'eins'] = 0
print df1

            zick  zack  eins
2014-06-01     1     1     0
2014-06-01     2     2     2
2014-06-02     3     3     3
2014-06-02     3     3     3

df1.update(df2, filter_func=lambda x: x == 0)
print df1

            zick  zack  eins
2014-06-01     1     1     2
2014-06-01     2     2     2
2014-06-02     3     3     3
2014-06-02     3     3     3