Панды умножают определенные столбцы на значение в строке - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь присвоить нескольким определенным столбцам значение в соответствующей строке.

Например:

          X         Y         Z
A 10      1         0         1        
B 50      0         0         0      
C 80      1         1         1

Будет:

              X         Y         Z
A 10        10         0         10        
B 50        0          0         0      
C 80        80         80        80

Проблема Iя имею в том, что это время ожидания, когда я использую mul ().Мой настоящий набор данных очень большой.Я попытался повторить это с циклом в моем реальном коде следующим образом:

for i in range(1,df_final_small.shape[0]): 
    df_final_small.iloc[i].values[3:248] = df_final_small.iloc[i].values[3:248] * df_final_small.iloc[i].values[2]

, который применительно к примеру dataframe будет выглядеть так:

for i in range(1,df_final_small.shape[0]): 
    df_final_small.iloc[i].values[1:4] = df_final_small.iloc[i].values[1:4] * df_final_small.iloc[i].values[0]

Должен быть лучший способдля этого у меня возникают проблемы с выяснением того, как приводить умножение только к определенным столбцам в строке, а не ко всей строке.

РЕДАКТИРОВАТЬ: Подробнее здесь мой df.head (5).

id  gross   150413 Welcome Email    150413 Welcome Email Repeat Cust    151001 Welcome Email    151001 Welcome Email Repeat Cust    161116 eKomi    1702 Hot Leads Email    1702 Welcome Email - All Purchases  1804 Hot Leads  ... SILVER  GOLD    PLATINUM    Acquisition Direct Mail Conversion Direct Mail  Retention Direct Mail   Retention eMail cluster x   y
0   0033333 46.2    0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 10  -0.230876   0.461990
1   0033331 2359.0  0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 9   0.231935    -0.648713
2   0033332 117.0   0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 5   -0.812921   -0.139403
3   0033334 89.0    0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 0.0 1.0 0.0 5   -0.812921   -0.139403
4   0033335 1908.0  0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 1.0 0.0 0.0 1.0 0.0 0.0 7   -0.974142   0.145032

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Просто укажите столбцы, которые вы хотите умножить.Пример

df=pd.DataFrame({'A':10,'X':1,'Y':1,'Z':1},index=[1])
df.loc[:,['X', 'Y', 'Z']]=df.loc[:,['X', 'Y', 'Z']].values*df.iloc[:,0:1].values

Если вы хотите указать произвольный диапазон столбцов, используйте iloc

range_of_columns= range(10,5001)+range(5030,10001)
df.iloc[:,range_of_columns].values*df.iloc[:,0:1].values #multiplying the range of columns with the first column
0 голосов
/ 11 октября 2018

Используя mul с axis = 0, вы также получите значение index на get_level_values

df.mul(df.index.get_level_values(1),axis=0)
Out[167]: 
       X   Y   Z
A 10  10   0  10
B 50   0   0   0
C 80  80  80  80

Кроме того, когда размер кадра данных слишком велик, вы можете разделить его на части.

dfs = np.split(df, [2], axis=0)
pd.concat([x.mul(x.index.get_level_values(1), axis=0) for x in dfs])
Out[174]: 
       X   Y   Z
A 10  10   0  10
B 50   0   0   0
C 80  80  80  80

Также буду рекомендовать numpy трансляцию

df.values*df.index.get_level_values(1)[:,None]
Out[177]: Int64Index([[10, 0, 10], [0, 0, 0], [80, 80, 80]], dtype='int64')
pd.DataFrame(df.values*df.index.get_level_values(1)[:,None],index=df.index,columns=df.columns)
Out[181]: 
       X   Y   Z
A 10  10   0  10
B 50   0   0   0
C 80  80  80  80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...