#python #pandas #dataframe #divide
Вопрос:
Я хочу разделить столбцы на другие столбцы в большом фрейме данных в панд. Как я могу выполнить эту операцию простым и быстрым способом?
Это пример:
sent1 sent2 sent3 media fake other
0.67 0.25 1.6 3.0 4.0 5.0
Мой результат был бы
sent1 sent2 media fake other sent1/media sent1/fake sent1/other sent2/media sent2/fake sent2/ot
0.67 0.25 3.0 4.0 5.0 0.22. 0.16. 0.134 0.08 0.625 0.05
Я хотел бы получить эти результаты самым простым способом.
До сих пор я рассчитывал это, делая:
df['sent1/media'] = df['sent1'] / df['media']
df['sent1/fake'] = df['sent1'] / df['fake']
df['sent1/other'] = df['sent1'] / df['other']
Ответ №1:
Вы могли бы сделать что-то вроде этого:
for num in ['sent1', 'sent2']:
for denom in ['media', 'fake', 'other']:
df[f'{num}/{denom}'] = df[num] / df[denom]
Комментарии:
1. в 3-й строке вашего кода есть ошибка, » num » и «denom» не являются столбцами df
Ответ №2:
Один broadcasting
из вариантов:
from itertools import product
import pandas as pd
df = pd.DataFrame({
'sent1': {0: 0.67}, 'sent2': {0: 0.25},
'sent3': {0: 1.6}, 'media': {0: 3.0},
'fake': {0: 4.0}, 'other': {0: 5.0}
})
# Grab sent1 and sent2 Columns
sents = df[['sent1', 'sent2']]
# Grab Non Sent Columns
others = df.filter(regex='^(?!sent)')
# Broadcast Division
results = (
sents.to_numpy()[..., None] / others.to_numpy()[:, None]
).reshape((len(df), len(sents.columns) * len(others.columns)))
# Convert to new dataframe with new column labels
new_df = pd.DataFrame(
results,
columns=map('/'.join,
(product(sents.columns.tolist(), others.columns.tolist())))
)
# Join to df
new_df = df.join(new_df)
print(new_df.to_string())
sent1 sent2 sent3 media fake other sent1/media sent1/fake sent1/other sent2/media sent2/fake sent2/other
0 0.67 0.25 1.6 3.0 4.0 5.0 0.223333 0.1675 0.134 0.083333 0.0625 0.05