将数据帧中每一行的前 h 值乘以 k python
Multiply top h values times k for each row in a dataframe python
我有一个数据框,其中一些日期作为行,值作为列。要了解 df 如下所示:
c1 c2 c3 c4
12/12/2016 38 10 1 8
12/11/2016 44 12 17 46
12/10/2016 13 6 2 7
12/09/2016 9 16 13 26
我正在尝试找到一种方法来遍历每一行并仅将前 2 个值乘以 k = 3。结果应该在现有 df 的新列中。非常感谢任何建议或提示!
谢谢!
在 groupby
+ nlargest
之后使用 update
df.update(df.stack().groupby(level=0).nlargest(2).mul(k).reset_index(level=0,drop=True).unstack())
df
Out[1036]:
c1 c2 c3 c4
12/12/2016 114.0 30.0 1 8.0
12/11/2016 132.0 12.0 17 138.0
12/10/2016 39.0 6.0 2 21.0
12/09/2016 9.0 48.0 13 78.0
nlargest
df.assign(newcol=df.apply(sorted, 1).iloc[:, -2:].sum(1) * 3)
c1 c2 c3 c4 newcol
12/12/2016 38 10 1 8 144
12/11/2016 44 12 17 46 270
12/10/2016 13 6 2 7 60
12/09/2016 9 16 13 26 126
partition
df.assign(newcol=np.partition(df, -2)[:, -2:].sum(1) * 3)
c1 c2 c3 c4 newcol
12/12/2016 38 10 1 8 144
12/11/2016 44 12 17 46 270
12/10/2016 13 6 2 7 60
12/09/2016 9 16 13 26 126
与df.where
+ df.rank
n = 2
k = 3
df.where(df.rank(1, method='dense') <= len(df.columns)-n, df*k)
c1 c2 c3 c4
12/12/2016 114 30 1 8
12/11/2016 132 12 17 138
12/10/2016 39 6 2 21
12/09/2016 9 48 13 78
为了解决您的更新问题,您仍然可以使用 where + rank,尽管它似乎不如用于上述操作。
df['new_col'] = df.where(df.rank(1, method='dense') >= len(df.columns)-n, df*0).sum(1)*k
c1 c2 c3 c4 new_col
12/12/2016 38 10 1 8 144
12/11/2016 44 12 17 46 270
12/10/2016 13 6 2 7 60
12/09/2016 9 16 13 26 126
我有一个数据框,其中一些日期作为行,值作为列。要了解 df 如下所示:
c1 c2 c3 c4
12/12/2016 38 10 1 8
12/11/2016 44 12 17 46
12/10/2016 13 6 2 7
12/09/2016 9 16 13 26
我正在尝试找到一种方法来遍历每一行并仅将前 2 个值乘以 k = 3。结果应该在现有 df 的新列中。非常感谢任何建议或提示!
谢谢!
在 groupby
+ nlargest
update
df.update(df.stack().groupby(level=0).nlargest(2).mul(k).reset_index(level=0,drop=True).unstack())
df
Out[1036]:
c1 c2 c3 c4
12/12/2016 114.0 30.0 1 8.0
12/11/2016 132.0 12.0 17 138.0
12/10/2016 39.0 6.0 2 21.0
12/09/2016 9.0 48.0 13 78.0
nlargest
df.assign(newcol=df.apply(sorted, 1).iloc[:, -2:].sum(1) * 3)
c1 c2 c3 c4 newcol
12/12/2016 38 10 1 8 144
12/11/2016 44 12 17 46 270
12/10/2016 13 6 2 7 60
12/09/2016 9 16 13 26 126
partition
df.assign(newcol=np.partition(df, -2)[:, -2:].sum(1) * 3)
c1 c2 c3 c4 newcol
12/12/2016 38 10 1 8 144
12/11/2016 44 12 17 46 270
12/10/2016 13 6 2 7 60
12/09/2016 9 16 13 26 126
与df.where
+ df.rank
n = 2
k = 3
df.where(df.rank(1, method='dense') <= len(df.columns)-n, df*k)
c1 c2 c3 c4
12/12/2016 114 30 1 8
12/11/2016 132 12 17 138
12/10/2016 39 6 2 21
12/09/2016 9 48 13 78
为了解决您的更新问题,您仍然可以使用 where + rank,尽管它似乎不如用于上述操作。
df['new_col'] = df.where(df.rank(1, method='dense') >= len(df.columns)-n, df*0).sum(1)*k
c1 c2 c3 c4 new_col
12/12/2016 38 10 1 8 144
12/11/2016 44 12 17 46 270
12/10/2016 13 6 2 7 60
12/09/2016 9 16 13 26 126