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
示例数据集:
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