Кубики данных Koalas: используйте для l oop для создания новых столбцов с условиями и динамического именования нового столбца на основе старых имен столбцов. - PullRequest
0 голосов
/ 26 марта 2020

Пример набора данных:

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]]

Я могу создавать новые столбцы один за другим в Коалах, используя:

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

Но я не знаю, как это сделать для всех силовых столбцов потому что мой набор данных действительно большой с 50+ столбцами мощности и 1000+ другими столбцами. Я использую Databricks. Я не хочу писать более 50 строк кода для всех столбцов мощности. Моя проблема здесь в том, что я не знаю, как динамически добавить «_Status» к моему исходному имени столбца «power_1» для l oop в Коалах. Я пытался для l oop, используя аналогичную pandas структуру. Вот что я попробовал, но не получилось.

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

Спасибо

1 Ответ

1 голос
/ 26 марта 2020

Я взглянул на документацию Коалы и использовал там некоторые функции, похожие на 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
...