[英]Order values horizontally within a group. Pandas
几个星期前,我问了一个关于在行中屏蔽nans的问题,只保留了现有的值,当value存在时将列索引作为值 1
@jezrael提供了出色的解决方案(您可以在上面的链接中找到它)。
除了原始任务外,我还需要根据值在单独的表中的权重对它们进行排序(升序)。
我将从头开始重新制定任务。
我有2张桌子:
和
我需要像以前的解决方案一样获得一张最终表,但要根据它们的权重使用有序的值,如下所示
是否可以将重新排序代码行合并到现有代码中? 或之后重新排序? 根据表分开怎么做?
感谢您的任何帮助!
请以可复制的形式(如下所示)提供您的数据,绝不要以图片形式提供。
df = pd.DataFrame({
'1a': [1] * 4 + [None] * 12,
'3f': [None] * 5 + [1] * 2 + [None] * 9,
'5y': [None] * 11 + [1] * 3 + [None] * 2,
't6': [None] * 7 + [1, 1,] + [None] * 7,
'7j': [None] * 14 + [1, 1]},
index=range(1, 17)).T
weights = pd.Series([.5, .4, .34, .54, .12, .45, .18, .45, .34, .19, .2, .18, .12, .56, .78, .98],
index=range(1, 17))
该解决方案将数据帧(布尔指标)乘以权重,然后使用列表推导对结果的每一行进行排序(首先删除空值之后)并获取索引。 根据结果创建一个DataFrame。
df2 = pd.DataFrame(
[row.dropna().sort_values().index.tolist()
for _, row in df.mul(weights).iterrows()],
index=df.index)
df2.columns = ['c{}'.format(n + 1) for n in range(df2.shape[1])]
>>> df2
c1 c2 c3 c4
1a 3 2 1 4
3f 7 6 NaN NaN
5y 13 12 14 NaN
7j 15 16 NaN NaN
t6 9 8 NaN NaN
df.mul(weights)
产生以下数据帧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1a 0.5 0.4 0.34 0.54 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3f NaN NaN NaN NaN NaN 0.45 0.18 NaN NaN NaN NaN NaN NaN NaN NaN NaN
5y NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.18 0.12 0.56 NaN NaN
7j NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.78 0.98
t6 NaN NaN NaN NaN NaN NaN NaN 0.45 0.34 NaN NaN NaN NaN NaN NaN NaN
然后,我使用iterrows
对这些行中的每一个进行迭代,删除NaN,并对结果进行排序并采用排序后的索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.