在组内计算差异

3

我有一个DataFrame,其中的行提供了一个特征在一个时间点上的值。时间由时间列标识(大约有1000000个不同的时间)。特征由特征列标识(有几十个特征)。对于任何特征和时间的组合,最多只有一行。在每个时间点,只有部分特征是可用的;唯一的例外是特征0,在所有时间点都是可用的。我想添加到该DataFrame中一列,显示该时间点上特征0的值。是否有一种相当快速的方法来实现呢?

例如,假设我有以下数据:

df = pd.DataFrame({
  'time': [1,1,2,2,2,3,3],
  'feature': [1,0,0,2,4,3,0],
  'value':[1,2,3,4,5,6,7],
})

我想添加一列包含[2,2,3,3,3,7,7]的数据。
我尝试使用groupby和布尔索引,但没有成功。
3个回答

3
我想在DataFrame中添加一列,显示该时间点的feature 0的值。有没有一个相当快速的方法来实现它? 我认为使用groupby(这是一个昂贵的操作)会导致代码冗余。尝试使用仅包含feature 0值的merge操作:
>>> pd.merge(
        df,
        df[df.feature == 0].drop('feature', axis=1).rename(columns={'value': 'value_0'}))
    feature     time    value   value_0
0   1   1   1   2
1   0   1   2   2
2   0   2   3   3
3   2   2   4   3
4   4   2   5   3
5   3   3   6   7
6   0   3   7   7

编辑

根据@jezrael的要求,这里有一个时间测试:

 import pandas as pd

 m = 10000

 df = pd.DataFrame({
   'time': range(m / 2) + range(m / 2),
   'feature': range(m / 2) + [0] * (m / 2),
   'value': range(m),
 })

在这个输入上,@jezrael的解决方案需要396毫秒,而我的只需要4.03毫秒。


你能否在我们的解决方案中添加性能比较,使用大型数据框进行测试?我现在只有手机,所以无法完成。谢谢。 - jezrael

0
如果您想要删除零行并将它们作为单独的列添加(与您最初的请求略有不同),可以执行以下操作:
# Create initial dataframe.
df = pd.DataFrame({
  'time': [1,1,2,2,2,3,3],
  'feature': [1,0,0,2,4,3,0],
  'value':[1,2,3,4,5,6,7],
})

# Set the index to 'time'
df = df.set_index('time')

# Join the zero feature value to the non-zero feature rows.
>>> df.loc[df.feature > 0, :].join(df.loc[df.feature == 0, 'value'], rsuffix='_feature_0')
      feature  value  value_feature_0
time                                 
1           1      1                2
2           2      4                3
2           4      5                3
3           3      6                7

0

您可以从列valueset_index,然后使用groupbytransform idxmin

如果列feature中的值0min,则此解决方案有效。

df = df.set_index('value')

df['diff'] = df.groupby('time')['feature'].transform('idxmin')
print df.reset_index()
   value  feature  time  diff
0      1        1     1     2
1      2        0     1     2
2      3        0     2     3
3      4        2     2     3
4      5        4     2     3
5      6        3     3     7
6      7        0     3     7

根据您的请求,我计时了一下。在我的测试中,您的解决方案运行速度大约慢100倍。 - Ami Tavory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接