Python:对不同大小的DataFrame使用numpy.where

时间:2019-11-07 12:55:14

标签: python pandas numpy dataframe

对于某些测量的后处理,我有三个大熊猫数据帧,如下所示:

df1:
   direction  sequence  timestamp  remote_timestamp     delta
0          U         1     461945                -1        -1
1          U         2     462106                -1        -1
2          U         3     462269                -1        -1
..       ...       ...        ...               ...       ...
97         U        98     477601                -1        -1
98         U        99     477762                -1        -1
99         U       100     477924                -1        -1

df2:
  direction  sequence  timestamp  remote_timestamp  delta
0          U       101     500663                -1     -1
1          U       102     500829                -1     -1
2          U       103     501000                -1     -1
..       ...       ...        ...               ...    ...
98         U       199     516631                -1     -1
99         U       200     516792                -1     -1




df3
   direction  sequence  timestamp  remote_timestamp  delta
0           U         1         -1            462791     -1
1           U         2         -1            462791     -1
2           U         3         -1            462894     -1
..        ...       ...          ...        ...               ...    ...
197         U       198         -1            525099     -1
198         U       199         -1            525100     -1
199         U       200         -1            525100     -1

所以我有两个具有100行的数据帧,一个具有200行的数据帧。现在,我想将第三个数据帧的“ remote_timestamp”列写入其序号位置的第一个和第二个数据框中。

对于任何一个框架,我都尝试过这样的操作:

df1['remote_timestamp'] = numpy.where(df1['sequence'].values == df3['sequence'].values,df3['remote_timestamp'],-1)

但是由于数据帧的长度不匹配,我得到了:

ValueError: Length of values does not match length of index

解决问题的方法是什么。也许numpy.where不是理想的解决方案。

谢谢

2 个答案:

答案 0 :(得分:0)

如果将“序列”列更改为第三个数据帧的索引,则可以直接访问所需的数据。下面的代码应该可以工作,但是我无法根据您给我们的内容重现您的示例

df3.set_index('sequence')
new_values=df3['remote_timestamp'].loc[df1['sequence']]
df1['remote_timestamp']=new_values

我自己做了一个可复制的示例,它看起来运行良好

df=pd.DataFrame({'a':[1,2,3,4,5]})
df2=pd.DataFrame({'a':[1,2,3,4,5,6,7,8,9,10],'b':[0,9,8,7,6,5,4,3,2,11]})

df.set_index('a')

df2['b'].loc[df['a']]

输出

1    9
2    8
3    7
4    6
5    5
Name: b, dtype: int64

希望这会有所帮助!并研究制作更小的可复制示例。它不仅可以帮助我们解决您的问题,而且在简化事情和制作小型测试用例时,我经常会解决自己的问题-

答案 1 :(得分:0)

如果df3中的sequence没有重复,请使用Series.map

df1['remote_timestamp']=df1['sequence'].map(df3.set_index('sequence')['remote_timestamp'])
df2['remote_timestamp']=df2['sequence'].map(df3.set_index('sequence')['remote_timestamp'])