【问题标题】:How to transform all non-zero values to a new column in pandas如何将所有非零值转换为熊猫中的新列
【发布时间】:2019-08-13 05:34:38
【问题描述】:

我有一个包含 81 列和大约 3000 行的数据框。下面是一个示例df。我需要将所有非零值转换为新列

    TO    Rubber    Wood    Plastic   Toy     Metal   Paper  Result
    AAA   0         0         0        0        0         9      1
    BBB   60        0         0        0        0         0     -1
    CCC   0         0.8       0        0        0         0      1
    DDD   0         0         0        40       0         0      1
    EEE   0         0         7        0        0         0      1
    FFF   0         0         0        0        10        0     -1

我已尝试将列名转换为新列,但无法为值做

     df['Mat'] = (df.iloc[:, 1:82] != 0).idxmax(1)

我需要的结果:

    TO    Rubber    Wood    Plastic   Toy     Metal   Paper  Result   WT    Mat
    AAA   0         0         0        0        0         9      1    60    Rubber
    BBB   60        0         0        0        0         0     -1 0.8      Wood
    CCC   0         0.8       0        0        0         0      1    7     Plastic
    DDD   0         0         0        40       0         0      1    40    Toy
    EEE   0         0         7        0        0         0      1    10    Metal
    FFF   0         0         0        0        10        0     -1    9      Paper

我想删除不必要的列,然后最终结果应该是

    To       Wt        Mat

    AAA      60        Rubber
    BBB      0.8       Wood
    CCC      7         Plastic
    DDD      40        Toy
    EEE      10        Metal
    FFF      9         Paper

【问题讨论】:

  • 似乎数据不匹配 - 源与预期输出。

标签: python-3.x pandas numpy dataframe numeric


【解决方案1】:
df = df.set_index(['TO']).sum().reset_index()[:6].rename({'index':'Mat',0:'Wt'},axis=1).join(df['TO'])
##df[['TO','Wt','Mat']]

    TO    Wt      Mat
0  AAA  60.0   Rubber
1  BBB   0.8     Wood
2  CCC   7.0  Plastic
3  DDD  40.0      Toy
4  EEE  10.0    Metal
5  FFF   9.0    Paper

【讨论】:

  • 优秀@iamklaus +1
  • @jezrael 感谢您的反馈.. :) 这就是首先找到的
【解决方案2】:

使用sum 选择所有找到值的列:

#1:7 by sample data, in real data seems 1:82
df['Wt'] = (df.iloc[:, 1:7]).sum(1)
df['Mat'] = (df.iloc[:, 1:82] != 0).idxmax(1)

#last select only necessary columns by list
df = df[['TO','Wt','Mat']]
print (df)
    TO    Wt      Mat
0  AAA   9.0    Paper
1  BBB  60.0   Rubber
2  CCC   0.8     Wood
3  DDD  40.0      Toy
4  EEE   7.0  Plastic
5  FFF  10.0    Metal

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多