2017-08-06 22 views
2
I have 2 dataframes: 

>>> type(c) 
Out[118]: pandas.core.frame.DataFrame 
>>> type(N) 
Out[119]: pandas.core.frame.DataFrame 

>>> c 
Out[114]: 
         t 
2017-06-01 01:06:00 1.00 
2017-06-01 01:13:00 1.00 
2017-06-01 02:09:00 1.00 
2017-06-26 22:47:00 1.00 

>>> N 
Out[115]: 
         0 1 
2017-06-01 01:06:00 1.00 1.00 
2017-06-01 01:13:00 1.00 1.00 
2017-06-01 02:09:00 1.00 1.00 
2017-06-26 22:47:00 1.00 1.00 

我需要一起相乘这些得到一个4,2数据帧,其与C.Ñ的elementwise的每一列我尝试以下方法4没有运气的乘法:大熊猫dataframes乘法具有或不具有广播

>>> N.multiply(c, axis='index') 
Out[116]: 
         0 1 t 
2017-06-01 01:06:00 nan nan nan 
2017-06-01 01:13:00 nan nan nan 
2017-06-01 02:09:00 nan nan nan 
2017-06-26 22:47:00 nan nan nan 

>>> c[:]*N 
Out[98]: 
         0 1 t 
2017-06-01 01:06:00 nan nan nan 
2017-06-01 01:13:00 nan nan nan 
2017-06-01 02:09:00 nan nan nan 
2017-06-26 22:47:00 nan nan nan 

>>> c*N 
Out[99]: 
         0 1 t 
2017-06-01 01:06:00 nan nan nan 
2017-06-01 01:13:00 nan nan nan 
2017-06-01 02:09:00 nan nan nan 
2017-06-26 22:47:00 nan nan nan 

>>> c[:, None]*N 
Traceback (most recent call last): 

    File "C:\...pandas\core\frame.py", line 1797, in __getitem__ 
    return self._getitem_column(key) 
    File "C:\...core\frame.py", line 1804, in _getitem_column 
    return self._get_item_cache(key) 
    File "C:\...core\generic.py", line 1082, in _get_item_cache 
    res = cache.get(item) 
TypeError: unhashable type 

有没有办法,有没有广播这样做很容易?

+1

注意:'c [:,无]'添加新轴的这种表示法适用于numpy数组 - 它不适用于DataFrames。如果你想先添加一个新的轴,你需要用'c.values [:,None]将它转换为一个numpy数组。' – ayhan

回答

3

问题是您传递一个DataFrame,所以它也尝试匹配列名称。如果你切列T,它会成为一个系列,它会适当地广播:

N.mul(c['t'], axis=0) 
Out: 
         0 1 
2017-06-01 01:06:00 1.0 1.0 
2017-06-01 01:13:00 1.0 1.0 
2017-06-01 02:09:00 1.0 1.0 
2017-06-26 22:47:00 1.0 1.0 

在numpy的阵列的情况下,你不需要任何指定。对于(4,2)和(4,1)形状,numpy将看到相同长度的轴并相应地进行广播。

考虑以下DataFrames:

N 
Out: 
         0 1 
2017-06-01 01:06:00 1.0 2.0 
2017-06-01 01:13:00 6.0 5.0 
2017-06-01 02:09:00 4.0 3.0 
2017-06-26 22:47:00 4.0 7.0 


c 
Out: 
         t 
2017-06-01 01:06:00 6.0 
2017-06-01 01:13:00 2.0 
2017-06-01 02:09:00 8.0 
2017-06-26 22:47:00 2.0 

您可以用.values属性访问底层的数组,以便

N.values * c.values 
Out: 
array([[ 6., 12.], 
     [ 12., 10.], 
     [ 32., 24.], 
     [ 8., 14.]]) 

会给你同样的结果

N.mul(c['t'], axis=0) 
Out: 
         0  1 
2017-06-01 01:06:00 6.0 12.0 
2017-06-01 01:13:00 12.0 10.0 
2017-06-01 02:09:00 32.0 24.0 
2017-06-26 22:47:00 8.0 14.0 

但由于整个操作都很麻烦,你会失去标签。

+0

谢谢,这很有帮助。为了充分理解这个概念,如果'N'是一个ndarray(4X2)和'c'数据帧,那么您认为什么是正确的方法?我需要首先将N转换为数据帧吗?在这种情况下,我尝试了N * c [:]和N * c ['t'],但没有奏效。 – dayum

+0

@dayum我更新了帖子。 – ayhan