Применение операций pandas ко всем ключам словаря - PullRequest
1 голос
/ 21 октября 2019

Учитывая pandas DataFrame df:

           paper    reference   count
9384155    p25      r50         1
7434371    p98      r9          78
7433400    p7       r27         5
7431765    p101     r91         501
7422256    p22      r5          91
...

Я создал словарь, который подмножество df на count:

df_dict={key:df[df['count']==key] for key in df['count'].unique()}

Для каждого подкадра DataFrameв df_dict я хотел бы применить следующие операции:

df_dict[i] = df_dict[i].drop(['count'], axis=1)

pairs = df_dict[i].merge(df_dict[i], on=["reference"])
pairs = pairs[pairs["paper_x"] < pairs["paper_y"]]
pairs = pairs.groupby(["paper_x", "paper_y"]).count().reset_index()
pairs.columns = ["paper1", "paper2", "common"]

refs = df_dict[i].groupby(["paper"]).count().reset_index()
refs.columns = ["paper", "freq"]

result = pairs.merge(refs, how="left", left_on="paper1", right_on="paper")
result = result.merge(refs, how="left", left_on="paper2", right_on="paper")
result = result[["paper1", "freq_x", "paper2", "freq_y", "common"]]
result.columns = ["paper1", "freq1", "paper2", "freq2", "common"]

Обратите внимание, что я создал словарь, чтобы применить операцию ко всем фреймам данных с разными значениями count по отдельности. Я попытался запустить цикл for:

for i in range(df['count'].max()):
  try:
    c = df_dict[i]
    c = c.drop(['count'], axis=1)
    pairs = c.merge(c,on=['reference'])
    pairs = pairs[pairs["paper_x"] < pairs["paper_y"]]
    pairs = pairs.groupby(["paper_x", "paper_y"]).count().reset_index() 
    pairs.columns = ["paper1", "paper2", "common"]    
    refs = c.groupby(["paper"]).count().reset_index()
    refs.columns = ["paper", "freq"]
    result = pairs.merge(refs, how="left", left_on="paper1", right_on="paper")
    result = result.merge(refs, how="left", left_on="paper2", right_on="paper")
    result = result[["paper1", "freq_x", "paper2", "freq_y", "common"]]
    result.columns = ["paper1", "freq1", "paper2", "freq2", "common"]
  except KeyError:
    continue

, но операция возвращает один большой DataFrame с неверными значениями.

(столбец count в df не обязательносодержит все целочисленные значения, поэтому может существовать KeyError, который необходимо игнорировать.)

В идеале, я хотел бы иметь множественный набор result DataFrames (разделенных count, как они есть в df_dict).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...