【问题标题】:How to change a non top 3 values columns in a dataframe in Python [duplicate]如何在Python中更改数据框中的非前3个值列[重复]
【发布时间】:2021-06-15 13:11:53
【问题描述】:

我有一个由 BOW 结果组成的数据框,名为 df_BOW

数据框看起来像这样

df_BOW
Out[42]: 
             blue      drama     this  ...      book      mask
0            3         0         1  ...         1         0
1            0         1         0  ...         0         4
2            0         1         3  ...         6         0
3            6         0         0  ...         1         0
4            7         2         0  ...         0         0
       ...       ...       ...  ...       ...       ...    ...
81991         0         0         0  ...         0         1
81992         0         0         0  ...         0         1
81993         3         3         5  ...         4         1
81994         4         0         0  ...         0         0
81995         0         1         0  ...         9         2

这个数据框有大约 12,000 列和 82,000 行

我想通过这样做来减少列数

对于每一行,只保留前 3 列,其他所有内容为 0

所以对于第 543 行(原始记录是这样的)

             blue      drama     this  ...      book      mask
543          1         11        21  ...         7        4

应该变成这个样子

             blue      drama     this  ...      book      mask
543          0         11        21  ...         7        0

仅保留前 3 列(戏剧、本、书)所有其他列都变为零

             blue      drama     this  ...      book      mask
929          5         3         2     ...         4        3

会变成

             blue      drama     this  ...      book      mask
929          5         3         0     ...         4        0

最后我应该删除所有行的所有列为零

我开始让这个函数循环所有行和所有列

for  i in range(0, len(df_BOW.index)):
    Col1No = 0
    Col1Val = 0
    Col2No = 0
    Col2Val = 0
    Col3No = 0
    Col3Val = 0
    

    for j in range(0, len(df_BOW.columns)):
        if (df_BOW.iloc[i,j] > min(Col1Val, Col2Val, Col3Val)):
            if (Col1Val <= Col2Val) & (Col1Val <= Col3Val):
                df_BOW.iloc[i,Col1No] = 0
                Col1Val = df_BOW.iloc[i,j]
                Col1No = j
            elif (Col2Val <= Col1Val) & (Col2Val <= Col3Val):
                df_BOW.iloc[i,Col2No] = 0
                Col2Val = df_BOW.iloc[i,j]
                Col2No = j
            elif (Col3Val <= Col1Val) & (Col3Val <= Col2Val):
                df_BOW.iloc[i,Col3No] = 0
                Col3Val = df_BOW.iloc[i,j]
                Col3No = j
               
      

                 

我不认为这个循环是最好的方法。

此外,使用此循环将无法处理前 50 列。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用pandas.Series.nlargest,将keep as first 传递给仅当前3 个最大值存在多个值时才包含第一条记录。最后使用fillna(0) 将所有NaN 列填充为0

    df.apply(lambda row: row.nlargest(3, keep='first'), axis=1).fillna(0)
    

    输出:

       blue  book  drama  mask  this
    0   0.0   1.0    0.0   0.0   1.0
    1   1.0   0.0    1.0   4.0   0.0
    2   2.0   6.0    0.0   0.0   3.0
    3   3.0   1.0    0.0   0.0   0.0
    4   4.0   0.0    2.0   0.0   0.0
    5   0.0   0.0    0.0   1.0   0.0
    6   0.0   0.0    0.0   1.0   0.0
    7   3.0   4.0    0.0   0.0   5.0
    8   4.0   0.0    0.0   0.0   0.0
    9   0.0   9.0    1.0   2.0   0.0
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2019-03-08
      • 2021-05-27
      • 2018-02-06
      • 1970-01-01
      • 2017-12-17
      • 2021-02-25
      • 2019-01-12
      • 2019-10-04
      相关资源
      最近更新 更多