簡體   English   中英

如何使用Pandas將共享數據的多行CSV組合成一行?

[英]How do I combine multiple rows of a CSV that share data into one row using Pandas?

我已經下載了ASCAP數據庫 ,為我提供了一個太大而無法處理的CSV。 我能夠將CSV打開以打開它的一部分,問題是數據在其默認格式中不是非常有用。 每首歌曲標題都有3行以上:

第一行包括ASCAP在該歌曲中的%份額。 之后的行包括一個字符代碼(ROLE_TYPE),指示該行是否包含該歌曲的編劇或執行者。 每行的第一列包含歌曲標題。

此結構使數據混亂,因為在列出%share的行上,NAME列中有空白單元格,因為該行沒有與之關聯的Writer / Performer。

我想要做的是將這些數據從每首歌曲中的3行轉換為每首歌曲包含所有相關數據的1行。

所以代替:

TITLE,ROLE_TYPE,NAME,SHARES,NOTE

我想將數據更改為:

TITLE,WRITER,PERFORMER,SHARES,NOTE

以下是數據示例:

TITLE,ROLE_TYPE,NAME,SHARES,NOTE
SCORE MORE,ASCAP,Total Current ASCAP Share,100,
SCORE MORE,W,SMITH ANTONIO RENARD,,
SCORE MORE,P,SMITH SHOW PUBLISHING,,
PEOPLE KNO,ASCAP,Total Current ASCAP Share,100,
PEOPLE KNO,W,SMITH ANTONIO RENARD,,
PEOPLE KNO,P,SMITH SHOW PUBLISHING,,
FEEDBACK,ASCAP,Total Current ASCAP Share,100,
FEEDBACK,W,SMITH ANTONIO RENARD,,

我想數據看起來像:TITLE,WRITER,PERFORMER,SHARES,NOTE SCORE MORE,SMITH ANTONIO RENARD,SMITH SHOW PUBLISHING,100,PEOPLE KNO,SMITH ANTONIO RENARD,SMITH SHOW PUBLISHING,100,FEEDBACK,SMITH ANONIO RENARD, SMITH SHOW PUBLISHING,100,

我正在使用python / pandas來嘗試使用數據。 我可以使用groupby('TITLE')對具有匹配標題的行進行分組。

import pandas as pd

data = pd.read_csv("COMMA_ASCAP_TEXT.txt", low_memory=False)

title_grouped = data.groupby('TITLE')

for TITLE,group in title_grouped:
  print(TITLE)
  print(group)

我能夠對每首歌曲進行分組('TITLE'),我得到的輸出似乎接近我想要的:

SCORE MORE
   TITLE          ROLE_TYPE  NAME                        SHARES    NOTE
0  SCORE MORE     ASCAP      Total Current ASCAP Share   100.0     NaN
1  SCORE MORE         W      SMITH ANTONIO RENARD        NaN       NaN
2  SCORE MORE         P      SMITH SHOW PUBLISHING       NaN       NaN 

我需要做什么來獲取這個組並在CSV文件中生成一行,其中包含與每首歌曲相關的所有數據?

我建議:

  • 通過ROLE_TYPE分解數據
  • 准備合並數據(重命名列並刪除不必要的列)
  • 將所有內容合並回一個DataFrame

將在合並的DataFrame中具有相同名稱的列上自動執行合並(在本例中為TITLE)。

似乎工作得很好:)

data = pd.read_csv("data2.csv", sep=",")

# Create 3 individual DataFrames for different roles
data_ascap = data[data["ROLE_TYPE"] == "ASCAP"].copy()
data_writer = data[data["ROLE_TYPE"] == "W"].copy()
data_performer = data[data["ROLE_TYPE"] == "P"].copy()

# Remove unnecessary columns for ASCAP role
data_ascap.drop(["ROLE_TYPE", "NAME"], axis=1, inplace=True)

# Rename columns and remove unnecesary columns for WRITER role
data_writer.rename(index=str, columns={"NAME": "WRITER"}, inplace=True)
data_writer.drop(["ROLE_TYPE", "SHARES", "NOTE"], axis=1, inplace=True)

# Rename columns and remove unnecesary columns for PERFORMER role
data_performer.rename(index=str, columns={"NAME": "PERFORMER"}, inplace=True)
data_performer.drop(["ROLE_TYPE", "SHARES", "NOTE"], axis=1, inplace=True)

# Merge all together
result = data_ascap.merge(data_writer, how="left")
result = result.merge(data_performer, how="left")

# Print result
print(result)

暫無
暫無

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

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