Слияние панелей данных панд и создание производного столбца - PullRequest
0 голосов
/ 07 февраля 2019

Дано 2 кадра данных панд

Med_DF

Key Med
 1  A
 1  B
 1  C
 2  A
 2  F
 3  A
 3  C
 3  E
 4  A
 4  B
 4  C
 4  D 

Key_DF

Key ID
1   A1
2   A2
3   A3
4   A4
5   A5

Как объединитьдва без дубликата Keys, сопоставить ID с каждым Key и создать производную переменную в новом столбце?Производная переменная будет возвращать число медалей за ID или пустое / Nan, если 0, как показано в Result_DF ниже

Result_DF

Key ID  Med
1   A1  3
2   A2  2
3   A3  3
4   A4  4
5   A5  

То, что я пробовал

Я уверен, что мое решение архаично и неэффективно, поэтому я прошу более чистое, потенциально более быстрое решение.Тем не менее, я создаю формулы Excel через циклы, чтобы заполнить производный столбец и найти ID, соответствующий Key.

# read in Med and Key files into dataframes
Med_DF = pd.read_csv(med_file, usecols = ['Key', 'Med'], encoding = 'utf-8', keep_default_na=False, na_values=[''])

Key_DF = pd.read_csv(key_file, usecols = ['Key', 'ID'], encoding = 'utf-8', keep_default_na=False, na_values=[''])

# add empty ID column to Med_DF
Med_DF.insert(0, "ID", "")

# assign length of dataframes
length_of_med = len(Med_DF)
length_of_key = len(Key_DF)

# create empty lists for formulas
med_countif = []
med_vlookup = []

# med VLOOKUP formulas 
for i in range(2,length_of_med+2):
    formula = '=VLOOKUP($B{0},Sheet1!$A:$B,2,FALSE)'.format(i)
    med_vlookup.append(formula)

# med COUNTIF formulas 
for i in range(2,length_of_key+2):
    formula = 
   '=IF(COUNTIF(Sheet1!$A:$A,$B{0})=0,"",COUNTIF(Sheet1!$A:$A,$B{0}))'.format(i)
    med_countif.append(formula)

# write formulas to columns
Key_DF.loc[:, "Meds"] = meds_formulas
Med_DF.loc[:, "Key"] = meds_vlookup

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019
  1. Используйте слияние панд с Key_DF и Med_DF на Ключе с левым внешним соединением.

  2. С результатом groupby the Key, IDс Med функцией подсчета

import pandas as pd
df = pd.merge(Key_DF,Med_DF[['Med','Key']],on='Key',how='left').groupby(["Key","ID"]).Med.agg({"Med":"count"})
df

Key ID  Med
1   A1  3
2   A2  2
3   A3  3
4   A4  4
5   A5  0

Здесь я получаю 5-ю строку как 0, так как я использую счет.Итак, если требуется получить Nan, мы можем добавить еще один шаг, чтобы заменить 0 на Nan

import numpy as np
df.Med.replace({0:np.nan})
0 голосов
/ 07 февраля 2019

Используйте join с value_counts или GroupBy.size для подсчета значений, значения преобразуются в float с, поскольку по крайней мере одинNaN - не соответствует значение:

df = Key_DF.join(Med_DF['Key'].value_counts().rename('Med'), on='Key')

Альтернатива:

df = Key_DF.join(Med_DF.groupby('Key').size().rename('Med'), on='Key')

print (df)
   Key  ID  Med
0    1  A1  3.0
1    2  A2  2.0
2    3  A3  3.0
3    4  A4  4.0
4    5  A5  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...