簡體   English   中英

從多個 CSV 文件創建 5 個新列

[英]Create 5 new columns from multiple CSV files

我有 4 個 CSV 文件,每個文件有 2 列。

User   Number  |  User1   Number1  |  User2    Number2  |  User3   Number3  
Sam         3  |  Tim           4  |  Mark          11  |  Jane          3
Tim         6  |  Gab           2  |  Jane          12  |  Moll          5
Ale         8  |  Jane          9  |  Moll           3  |  Mary          5
Jane        2  |  Tj            7  |  Gab            8  |  Kim           3

過程

  1. 創建 2 個新列,其中包含僅出現一次的所有用戶的用戶和號碼信息。
  2. 當名稱存在於多個 CSV 中時,創建另外 2 個列。
  3. 那些出現不止一次的,其新編號是它們在不同 CSV 中的編號相加。
  4. 有一列說明重復名稱來自哪個 CSV。

所需 Output

User   Number  |  User1    Number1  |  Which CSV
Sam         3  |  Tim           10  |  User, User1
Ale         8  |  Jane          26  |  User, User1, User2, User3
TJ          7  |  Gab           10  |  User1, User2
Mark       11  |  Moll           8  |  User2, User3
Mary        5  |         
Kim         3  |

試圖

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 = ["lcnames", "lcagg"]
username3_likes3 = usernameandlikes.loc[usernameandlikes['lcnames'].isin(list(set(df["username"]).intersection(set(df["username2"]))))].reset_index(drop=True) 
username3_likes4 = usernameandlikes.loc[usernameandlikes['lcnames'].isin(list(set(df["username"]).symmetric_difference(set(df["username2"]))))].reset_index(drop=True) 

首先,我會將所有數據append()到一個 DataFrame 中,其中包含三列UserNumberFile

在代碼中,我只使用模塊io來模擬文件。

csv0 = '''User   Number
Sam         3
Tim         6
Ale         8
Jane        2'''

csv1 = '''User1   Number1
Tim           4
Gab           2
Jane          9
Tj            7'''

csv2 = '''User2    Number2
Mark          11
Jane          12
Moll           3
Gab            8'''

csv3 = '''User3   Number3
Jane          3
Moll          5
Mary          5
Kim           3'''

import pandas as pd
import io

df0 = pd.read_csv(io.StringIO(csv0), sep='\s+')
df0['File'] = 'User'
#print(df0)

df1 = pd.read_csv(io.StringIO(csv1), sep='\s+')
df1.columns = ['User', 'Number']
df1['File'] = 'User1'
#print(df1)

df2 = pd.read_csv(io.StringIO(csv2), sep='\s+')
df2.columns = ['User', 'Number']
df2['File'] = 'User2'
#print(df2)

df3 = pd.read_csv(io.StringIO(csv3), sep='\s+')
df3.columns = ['User', 'Number']
df3['File'] = 'User3'
#print(df3)

df = df0.append([df1, df2, df3]).reset_index(drop=True)
print(df)

結果:

    User  Number   File
0    Sam       3   User
1    Tim       6   User
2    Ale       8   User
3   Jane       2   User
4    Tim       4  User1
5    Gab       2  User1
6   Jane       9  User1
7     Tj       7  User1
8   Mark      11  User2
9   Jane      12  User2
10  Moll       3  User2
11   Gab       8  User2
12  Jane       3  User3
13  Moll       5  User3
14  Mary       5  User3
15   Kim       3  User3

現在我可以使用groupby('User')到 select userw 這在所有數據中只有一次

print('--- single ---')
df_single = df.groupby('User').filter(lambda x: len(x) == 1)
print(df_single)

結果:

--- single ---
    User  Number   File
0    Sam       3   User
2    Ale       8   User
7     Tj       7  User1
8   Mark      11  User2
14  Mary       5  User3
15   Kim       3  User3

對於數據多次的用戶也是如此

print('--- multi ---')
df_multi = df.groupby('User').filter(lambda x: len(x) > 1)
print(df_multi)

結果:

--- multi ---
    User  Number   File
1    Tim       6   User
3   Jane       2   User
4    Tim       4  User1
5    Gab       2  User1
6   Jane       9  User1
9   Jane      12  User2
10  Moll       3  User2
11   Gab       8  User2
12  Jane       3  User3
13  Moll       5  User3

我可以使用groupby().sum()對數字求和

print('--- multi sum ---')
df_multi_sum = df_multi.groupby('User').sum().reset_index()
print(df_multi_sum)

結果:

--- multi sum ---
   User  Number
0   Gab      10
1  Jane      26
2  Moll       8
3   Tim      10

groupby().apply()創建列Which CSV

print('--- multi sum file ---')
df_multi_sum['Which CSV'] = df_multi.groupby('User').apply(lambda x: ','.join(x['File'])).reset_index()[0]
print(df_multi_sum)

結果:

--- multi sum file ---
   User  Number               Which CSV
0   Gab      10             User1,User2
1  Jane      26  User,User1,User2,User3
2  Moll       8             User2,User3
3   Tim      10              User,User1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM