Панды объединяются и держатся правее и удаляются влево - PullRequest
1 голос
/ 18 марта 2019

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

Я пытался выполнить эту задачу, используя панд merge следующим образом.

Я делаю outer Объедините два фрейма данных следующим образом, установив Indicator как True.

# df_friday has 10 securities
# df _saturday has 3 securities
merge_df=pd.merge(df_friday,df_saturday,on='security',how="outer",indicator=True)

merge_df = merge_df[merge_df['_merge']=='left_only']
merge_df =merge_df.drop(['price_y','_merge'],axis=1)
merge_df = merge_df.rename(columns = {'price_x':'price'})

df_saturday = pd.concat([df_saturday,merge_df],ignore_index=True)

Мои столбцы двух фреймов данных совпадают,

Columns: [security, price]

Я сделал это правильно? Или я могу сделать это простым способом?

Например,

# df_friday
  security price
1 apple    35.25
2 reliance  25.5
3 samsung   12.5
4 tata      28.5
5 sony      30.2

# df_saturday
  security price
1 reliance  26.8
2 samsung   11.2

# df_saturday_result should be as follows,
  security price
1 reliance  26.8
2 samsung   11.2
3 apple    35.25
4 tata      28.5
5 sony      30.2

Ответы [ 3 ]

3 голосов
/ 18 марта 2019

Я думаю, что вы можете сделать

df_saturday = df_saturday.merge(df_friday, how='outer', on=['security','price']).drop_duplicates(['security'], keep='first')

print(df_saturday)

Выход:

   price    security                                                                                                                    
0  26.80  reliance                                                                                                                    
1  11.20   samsung                                                                                                                    
2  35.25     apple                                                                                                                    
5  28.50      tata                                                                                                                    
6  30.20      sony
2 голосов
/ 18 марта 2019

Провел некоторые проверки синхронизации для 3 методов, упомянутых в других ответах.

fri =pd.DataFrame (columns =['security', 'price'], index = range(3), data =[['a',2],['b',4],['c',6]] )
sat =pd.DataFrame (columns =['security', 'price'], index = range(2), data =[['a',3],['c',5]] )
In [90]: %timeit out = sat.merge(fri, how='outer', on=['security', 'price']).drop_duplicates()
5.19 ms ± 150 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [91]: %timeit result_1 = pd.concat([sat,fri],ignore_index=True).drop_duplicates(subset=['security'], keep='first')
1.82 ms ± 26.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [92]: %timeit result_2 = pd.concat([sat, fri[~fri.security.isin(sat.security)]], ignore_index=True)
1.19 ms ± 113 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [93]: %timeit out = sat.merge(fri, how='outer', on=['security', 'price']).drop_duplicates()
5.02 ms ± 181 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Похоже, что фильтрация, а затем конкатенация - самая быстрая, тогда как concat и дедупликация не так уж и плохи. Слияние довольно медленное по сравнению.

2 голосов
/ 18 марта 2019

Вы также можете использовать pandas.concat ():

КОД:

import pandas as pd

fri =pd.DataFrame (columns =['security', 'price'], index = range(3), data =[['a',2],['b',4],['c',6]] )
sat =pd.DataFrame (columns =['security', 'price'], index = range(2), data =[['a',3],['c',5]] )
print ('TEST DATA:')
print (fri)
print (sat)

print ('\nSOLUTION 1: concatenate and eliminate duplicates')
result_1 = pd.concat([sat,fri],ignore_index=True).drop_duplicates(subset=['security'], keep='first')
print (result_1)

print ('\nSOLUTION 2: filter unique and then concatenate')
fri_unique = fri[~fri.security.isin(sat.security)]
result_2 = pd.concat([sat, fri_unique], ignore_index=True)
print (result_2)

ВЫХОД:

TEST DATA:
  security  price
0        a      2
1        b      4
2        c      6
  security  price
0        a      3
1        c      5

SOLUTION 1: concatenate and eliminate duplicates
  security  price
0        a      3
1        c      5
3        b      4

SOLUTION 2: filter unique and then concatenate
  security  price
0        a      3
1        c      5
2        b      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...