在组中水平订购值。大熊猫

时间:2019-04-24 15:24:13

标签: python pandas

几个星期前,我问了一个关于连续屏蔽nan的问题,只保留了现有值Get the column index as a value when value exists 1

@jezrael提供了出色的解决方案(您可以在上面的链接中找到它)。

除了原始任务之外,我还需要根据值在单独的表中的权重对它们进行排序(升序)。

我将从头开始重新制定任务。

我有2张桌子:

enter image description here

enter image description here

我需要像以前的解决方案一样获得一张最终表,但要根据其权重按如下顺序排序值

enter image description here

是否可以将重新排序代码行合并到现有代码中?或之后重新排序?如何将表格分开放置?

谢谢您的帮助!

1 个答案:

答案 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,并对结果进行排序并获得排序后的索引。