繁体   English   中英

在组中水平订购值。 熊猫

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM