【问题标题】:Generating a new variable based on the values of other variables根据其他变量的值生成新变量
【发布时间】:2022-08-15 04:36:18
【问题描述】:

我有以下数据集

import pandas as pd
df = pd.DataFrame({\"ID\": [1,1,1,1,1,2,2,2,2,2],
 \"TP1\": [1,2,3,4,5,9,8,7,6,5],
 \"TP2\": [11,22,32,43,53,94,85,76,66,58],
 \"TP10\": [114,222,324,443,535,94,385,76,266,548],
 \"count\": [1,2,3,4,10,1,2,3,4,10]})
print (df)

我想要一个基于 ID、TP 和计数变量的 df 中的“Final”变量。

最终结果将如下所示。

import pandas as pd
import numpy as np
df = pd.DataFrame({\"ID\": [1,1,1,1,1,2,2,2,2,2], \"TP1\": [1,2,3,4,5,9,8,7,6,5],
                   \"TP2\": [11,22,32,43,53,94,85,76,66,58], \"TP10\": [114,222,324,443,535,94,385,76,266,548],
                   \"count\": [1,2,3,4,10,1,2,3,4,10],
                   \"final\" : [1,22,np.nan,np.nan,535,9,85,np.nan,np.nan,548]})
print (df)

例如, if 的循环将执行以下操作

  1. 它将查看 ID
  2. 那么对于第一个 ID,它应该查看 count 的值,如果 count 的值为 1
  3. 然后如果应该查看变量 TP1,它的第一个值应该放在 \"final\" 变量中。

    然后查看 ID 1 的计数 2,TP2 的值应该出现在“final”变量中,依此类推。

    我希望我的问题很清楚。我正在寻找一个循环,因为原始数据集中有 1000 个 TP 变量。

    我试图制作类似以下的代码,但它完全是垃圾。

    for col in df.columns:
        if col.startswith(\'TP\') and count == int(col[2:])
            df[\"Final\"] = count
    

    谢谢

  • 在您的预期输出中,71、1836 等来自哪里。前 2 行不应该取自 TP1。即应该是1, 2 而不是71, 1836。请说清楚。

标签: python pandas loops for-loop if-statement


【解决方案1】:

如果我的理解是正确的,如果count=1 则选择TP1,如果count=2 则选择TP2 等。

这可以通过numpy.select() 完成。请注意,我添加了条件if f"TP{x}" in df.columns,因为并非所有列TP1, TP2, TP3, ... TP10 在数据框中都可用。如果所有这些都在您的实际数据框中可用,则不需要此 if 语句。

import numpy as np

conds = [df["count"] == x for x in range(1,11) if f"TP{x}" in df.columns]
output = [df[f"TP{x}"] for x in range(1,11) if f"TP{x}" in df.columns]
df["final"] = np.select(conds, output, np.nan)

print(df)

输出:

   ID  TP1  TP2  TP10  count  final
0   1    1   11   114      1    1.0
1   1    2   22   222      2   22.0
2   1    3   32   324      3    NaN
3   1    4   43   443      4    NaN
4   1    5   53   535     10  535.0
5   2    9   94    94      1    9.0
6   2    8   85   385      2   85.0
7   2    7   76    76      3    NaN
8   2    6   66   266      4    NaN
9   2    5   58   548     10  548.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多