Создание 4 новых столбцов csv с использованием 2 столбцов данных - PullRequest
1 голос
/ 08 мая 2020

У меня есть csv с 4 столбцами и помещаю его в pandas

username   likes  username2   likes2

Mill       2      John        10
John       3      Clyde       2 
Tye        7      Ellie       4
Clyde      8      Mill        9
Ellie      2      Ken         2

Я пытаюсь создать четыре новых столбца:

  1. username3 со списком всех пользователей, имена которых указаны в username и username2.

  2. like3 с суммированием номеров likes и likes2 для этих пользователей.

  3. username4 список пользователей, которые появляются в любом списке только один раз.

  4. likes4 с неизменными лайками этих пользователей.

Желаемый выход:

username   likes  username2   likes2  username3  likes3  username4  likes4

Mill       2      John        10      Mill       11      Tye        7
John       3      Clyde       2       John       13      Ken        2
Tye        7      Ellie       4       Clyde      10
Clyde      8      Mill        9       Ellie      6
Ellie      2      Ken         2

1 Ответ

0 голосов
/ 09 мая 2020

Один из способов сделать это:

  • Превратите свои имена пользователей и лайки, а также имена пользователей2 и лайки2 в 2 словаря {username, Like} и {username2 ,like2}
  • Добавить значения совпадающих ключей, а ключи, которые не совпадают, не будут иметь ничего добавленного к ним. Превратите это в новую серию под названием usernamesandlikes.
  • usernameandlikes содержит все имена пользователей и суммированные лайки для оставшихся 4 столбцов, поэтому все, что вам нужно сделать, это отфильтровать их в соответствующие столбцы, используя список intersection для username3 и symmetric_difference список для имени пользователя4

Код для этого ниже:

import pandas as pd
import numpy as np
import collections, functools, operator 

df = pd.read_csv("your_file.csv")

usernameandlikes = pd.Series(dict(functools.reduce(operator.add, map(collections.Counter, [dict(zip(df["username"], df["likes"])),  dict(zip(df["username2"], df["likes2"]))])))).reset_index() 
usernameandlikes.columns = ["users", "likes"]

username3_likes3 = usernameandlikes.loc[usernameandlikes['users'].isin(list(set(df["username"]).intersection(set(df["username2"]))))].reset_index(drop=True)

username3_likes4 = usernameandlikes.loc[usernameandlikes['users'].isin(list(set(df["username"]).symmetric_difference(set(df["username2"]))))].reset_index(drop=True)

dfoutput = pd.concat([df, username3_likes3, username3_likes4], axis=1)
dfoutput.columns = ["username", "likes", "username2", "likes2", "username3", "likes3", "username4", "likes4"]

  username  likes username2  likes2 username3  likes3 username4  likes4
0     Mill      2      John      10      Mill    11.0       Tye     7.0
1     John      3     Clyde       2      John    13.0       Ken     2.0
2      Tye      7     Ellie       4     Clyde    10.0       NaN     NaN
3    Clyde      8      Mill       9     Ellie     6.0       NaN     NaN
4    Ellie      2       Ken       2       NaN     NaN       NaN     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...