Pandas Результаты фильтра данных кадра с объединением. Проблемы с кодированием - PullRequest
2 голосов
/ 05 апреля 2020

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

В настоящее время я пишу количественный анализ для личного использования. Я получил csv-файл через tushare-pro, который представляет собой фрейм данных из 3825 строк.

df1 = pd.DataFrame(pd.read_csv(stock_stats_ts.csv))
data1 = np.array(df1.loc[:,:])

возвращает

[[300826 'N测绘' '建筑工程' ... 41.16 16.85 40171.0]
 [2770 '科迪乳业' '乳制品' ... 21.05 4.38 47133.0]
 [2503 '搜于特' '服饰' ... 8.6 3.08 65664.0]
 ...
 [2260 '*ST德奥' '家用电器' ... 23.08 3.03 24704.0]
 [995 '*ST皇台' '白酒' ... 68.05 -35.24 10275.0]
 [939 '*ST凯迪' '新型电力' ... 10.79 -74.92 79373.0]]

и затем я ограничиваю его до желаемых вещей, таких как код / ​​имя / esp / pb / roe

df2 = df1.loc[:,['code','name','esp','pb','npr']]
data2 = np.array(df1.loc[:,:])

возвращает

[[300826 'N测绘' 1.08 2.79 16.85]
 [2770 '科迪乳业' 0.03 2.13 4.38]
 [2503 '搜于特' 0.098 2.17 3.08]
 ...
 [2260 '*ST德奥' 0.034 0.0 3.03]
 [995 '*ST皇台' -0.079 0.0 -35.24]
 [939 '*ST凯迪' -0.362 0.0 -74.92]]

, и у меня также есть список названий акций, которые мне нужны из предыдущей сессии

df3 = pd.DataFrame(pd.read_csv(candidates.csv))
data3 = np.array(df3.loc[:,['candidates']])

возврат

[['维维股份']
 ['ST正源']
 ['美克家居']
 ['*ST金山']
 ['大有能源']
 ['好当家']
 ['贵州茅台']
 ['通策医疗']
 ['杭州解百']
 ['耀皮玻璃']
 ['梅花生物']
 ['金牌厨柜']
 ['继峰股份']
 ['胜利股份']
 ['渝 开 发']
 ['云南白药']
 ['中原环保']
 ['兴蓉环境']
 ['华闻集团']
 ['粤 水 电']
 ['濮耐股份']
 ['*ST东南']
 ['洪涛股份']
 ['达实智能']
 ['千红制药']
 ['闽发铝业']
 ['史丹利']
 ['加加食品']
 ['张家港行']
 ['国联水产']]

В чем я уверен, так это что мои кандидаты точно в столбцах df2 [имя], а затем, с какими строками кодов, чтобы я мог отфильтровать свой df2 на основе результатов, полученных от df3?

Благодаря шефу @Rexhil Regmi и @nimrodm, мой вопрос отлично работал с pd.merge. Однако все эти китайские символы в кодировке «gbk», которые невозможно прочитать в MS Excel. Любые подсказки, чтобы изменить их в 'utf8'?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Лучшее решение - объединить две таблицы (аналогично SQL JOIN). Pandas merge выполняет внутреннее объединение, то есть вы выбираете только строки, которые имеют совпадающую запись во фрейме данных кандидатов.

Так, например, result.csv равно

name,value
first,10
second,20
third,30

И selected.csv is

candidates
first
third

Считайте оба из них как DataFrames (не нужно преобразовывать в массив numpy):

data = pd.read_csv('result.csv')
selected = pd.read_csv('selected.csv')

И соедините их (how параметр является необязательным, поскольку inner является значением по умолчанию для merge)

data.merge(selected, how='inner', left_on='name',right_on='candidates')

    name  value candidates
0  first     10      first
1  third     30      third

Это объединяет два кадра данных, ищущих строки, в которых значение data [j, 'name'] == data [k ,'андидаты ']

Другой вариант

Другой подход заключается в прямом выборе строк, в которых name (в моем примере) находится в заданном списке:

data[data['name'].isin(selected['candidates'])]    

    name  value 
0  first     10
2  third     30

Это, вероятно, неэффективно, если, возможно, список кандидатов не очень короткий.

2 голосов
/ 05 апреля 2020

Вы можете использовать слияние для этой вашей проблемы.

new_df = df3.merge(df1, left_on='candidate', right_on='name', how='left')

Это должно дать вам то, что вы ищете.

...