Databricks Koalas:使用for循环创建有条件的新列,并根据旧列名动态命名新列

Databricks Koalas: use for loop to create new columns with conditions and dynamically name the new column based on the old column names

示例数据集:

kdf = ks.DataFrame({"power_1": [50, 100, 150, 120, 18], 
                   "power_2": [50, 150, 150, 120, 18],
                   "power_3": [60, 100, 150, 120, 18],
                   "power_4": [150, 90, 150, 120, 18],
                   "power_30": [50, 60, 150, 120, 18]
                   })

df = pd.DataFrame({"power_1": [50, 100, 150, 120, 18], 
                   "power_2": [50, 150, 150, 120, 18],
                   "power_3": [60, 100, 150, 120, 18],
                   "power_4": [150, 90, 150, 120, 18],
                   "power_30": [50, 60, 150, 120, 18]
                   })

我在 pandas 知道怎么做。以下是我的代码:

cols = df.filter(regex='power_').columns
for col in cols:
    df[col] = pd.to_numeric(df[col],errors='coerce')
    df[col+'_Status']= ['OFF' if x<100 or np.isnan(x) else 'ON' for x in df[col]]

我可以使用以下方法在 Koalas 中一一创建新列:

kdf = kdf.assign(power_1_Status=(kdf['power_1'].gt(100)).astype(int).map({0:'OFF',1:'ON'}))

但我不知道如何对所有幂列执行此操作,因为我的数据集非常大,有 50 多个幂列和 1000 多个其他列。我正在使用数据块。我不想为所有电源列编写 50 多行代码。我这里的问题是我不知道如何在 Koalas 的 for 循环中将“_Status”动态添加到我的原始列名 "power_1" 中。 我尝试使用类似的 pandas 结构进行循环。这是我尝试但失败的方法。

for col in cols:
    kdf = kdf.assign(col+'Status'=(kdf[col].gt(100)).astype(int).map({0:'OFF',1:'ON'}))

谢谢

我查看了 Koala 的文档并使用了一些类似于 pandas' 的函数,所以试一试,看看它是否有效:

 #select columns you are interested in into a separate dataframe
 filtered = df.filter(like='power_')

 #drop the filtered columns from df
 df = df.drop(filtered.columns,axis=1)

 #do some cleanup
 filtered = (filtered
            .astype(int)
            .gt(100)
            .applymap(lambda x: 'OFF' if x==0 else 'ON')
            .add_suffix('_STATUS'))

 #hook back to original dataframe
 pd.concat([df,filtered],axis=1)

您可能希望在创建过滤后的数据框时使用副本;只是一个建议,因为我不知道考拉的相关费用是多少。

 power_1_STATUS power_2_STATUS  power_3_STATUS  power_4_STATUS  power_30_STATUS
0   OFF              OFF              OFF            ON               OFF
1   OFF               ON              OFF            OFF              OFF
2   ON                ON               ON            ON               ON
3   ON                ON               ON            ON               ON
4   OFF              OFF              OFF            OFF              OFF