Python: операции с колонками и строками без использования цикла - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть ниже df1:

  Date        Tickers Qty
01-01-2018    ABC    25
02-01-2018    BCD    25
02-01-2018    XYZ    31
05-01-2018    XYZ    25

и еще один df2, как показано ниже

  Date         ABC  BCD  XYZ
01-01-2018    123   5   78
02-01-2018    125   7   79
03-01-2018    127   6   81
04-01-2018    126   7   82
05-01-2018    124   6   83

Я хочу результирующий столбец в df1, который является продуктомправильного столбца и строки в df2 - получить правильную ставку тикера на данную дату и позволить другим датам иметь nan в пределах df1

  Date       df1['Product']
01-01-2018      3075
02-01-2018      175
02-01-2018      2449
03-01-2018      nan
04-01-2018      nan
05-01-2018      2075

Это похоже на стандартную операцию на Python, но я простоя не могу достичь этого без написания цикла - выполнение которого занимает очень много времени:

Я объединил две вышеупомянутые таблицы на Date, а затем запустил цикл ниже

for i in range(len(df1)):
    try:
        df1['Product'][i] = df1[df1['Ticker'][i]][i]
    except ValueError:
        df['Product'][i] = np.nan

Есть ли лучший питонный способ достижения этого и не писать этот цикл, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Использование:

df11 = df1.pivot('Date', 'Tickers','Qty')
df22 = df2.set_index('Date')

s = df22.mul(df11).bfill(axis=1).iloc[:, 0]
print (s)
Date
01-01-2018     3075.0
02-01-2018      175.0
03-01-2018        NaN
04-01-2018        NaN
05-01-2018     2075.0
Name: ABC, dtype: float64

Решение для добавления нового столбца в df1:

df11 = df1.pivot('Date', 'Tickers','Qty')
df22 = df2.set_index('Date')

df = df1.join(df22.mul(df11).stack().rename('new'), on=['Date','Tickers'], how='left')
print (df)
         Date Tickers  Qty     new
0  01-01-2018     ABC   25  3075.0
1  02-01-2018     BCD   25   175.0
2  05-01-2018     XYZ   25  2075.0

РЕДАКТИРОВАНИЕ:

Если пары Date с Tickers продублированы, решение выше не возможно использовать.

print (df1)
         Date Tickers  Qty
0  01-01-2018     ABC   25
1  01-01-2018     ABC   20 <-added duplicated pairs 01-01-2018 and ABC
2  02-01-2018     XYZ   31
3  02-01-2018     BCD   25
4  05-01-2018     XYZ   25

df3 = df1[['Date']].copy()
#add new values to column
df3['new'] = df2.set_index('Date').lookup(df1['Date'], df1['Tickers']) * df1['Qty']
#add missing values to duplicated Dates 
df3 = df2[['Date']].drop_duplicates().merge(df3, how='left') 
print (df3)
         Date     new
0  01-01-2018  3075.0
1  01-01-2018  2460.0
2  02-01-2018  2449.0
3  02-01-2018   175.0
4  03-01-2018     NaN
5  04-01-2018     NaN
6  05-01-2018  2075.0
0 голосов
/ 12 сентября 2018

вам нужно установить 'Date' как индекс и умножить,

df1=df1.set_index('Date')
df2=df2.set_index('Date')


df3=(df2['ABC']*df1['Qty']).reset_index() 
print(df3)
    Date        0
0   01-01-2018  3075.0
1   02-01-2018  3125.0
2   03-01-2018  NaN
3   04-01-2018  NaN
4   05-01-2018  3100.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...