几个星期前,我问了一个关于连续屏蔽nan的问题,只保留了现有值Get the column index as a value when value exists 1
@jezrael提供了出色的解决方案(您可以在上面的链接中找到它)。
除了原始任务之外,我还需要根据值在单独的表中的权重对它们进行排序(升序)。
我将从头开始重新制定任务。
我有2张桌子:
和
我需要像以前的解决方案一样获得一张最终表,但要根据其权重按如下顺序排序值
是否可以将重新排序代码行合并到现有代码中?或之后重新排序?如何将表格分开放置?
谢谢您的帮助!
答案 0 :(得分:1)
请以可复制的形式(如下所示)提供您的数据,绝不要以图片的形式提供。
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,并对结果进行排序并获得排序后的索引。