我有一個大的 csv,其中每一行都是一個單獨的學校課程,每個課程都標有一個或多個主題,如下所示:
| 學校名稱 | 部 | 課程名 | 話題 |
|---|---|---|---|
| 一個 | A1 | X | 1個;2 |
| 一個 | A1 | 是 | 1個;3 |
| 乙 | B1 | Z | 1個;2;4 |
| C | C1 | XX | 1個;5 |
我需要計算每門課程的每個主題的存在。每個主題都需要作為自己的列附加,每行編碼為 0 或 1,具體取決于該主題是否存在于課程中。總共有 49 個主題,所以我需要在表格中添加 49 行。
有 4000 行,其中許多是相同課程名稱的重復,因此也需要對它們進行分組。例如,如果課程名稱 X 的一個實體具有主題 1、2,但同一課程的另一個實體具有主題 1、3,則列主題 1 的二進制值應為 1,主題 2 應為 1,主題 3 應為 1 ,而其余??主題列編碼為 0。
輸出應如下所示:
| 學校名稱 | 部 | 課程名 | 話題一 | 主題 2 | 話題 3 | 話題 4 | 主題 5 |
|---|---|---|---|---|---|---|---|
| 一個 | A1 | X | 1 | 1 | 0 | 0 | 0 |
| 一個 | A1 | 是 | 1 | 0 | 1 | 0 | 0 |
| 乙 | B1 | Z | 1 | 1 | 0 | 1 | 0 |
| C | C1 | XX | 1 | 0 | 0 | 0 | 1 |
我有一個嵌套回圈結構,它按分號拆分主題,然后進行一些清理以標準化主題名稱,但我堅持如何為每個編碼為正確二進制值的主題附加一個新列。
import pandas as pd
import io
df = pd.read_csv(io.BytesIO(uploaded['courses.csv']))
df_dict = {}
result = []
topic = []
count = []
for item in df['Course ID']:
for item in df['Final Code']:
if type(item) == str:
item_list = item.split(';')
for each in item_list:
each = each.strip().lower()
if each == "[too ambigious]" or each == "too ambiguous":
each = "[too ambiguous]"
if each == "equity and equality\\":
each = "equity and equality"
if each == "[NA]" or each == "N/A":
each = "NA"
#create new column for each unique topic
for item in df['Final Code']:
result.append(item)
#1 if that topic is present in each course, else 0
if each in df_dict:
df_dict[each] = 1
else:
df_dict[each] = 0
print(df_dict)
print(result)
print(df)
好久沒用python了,忘記怎么弄了。
uj5u.com熱心網友回復:
你可以試試這個:
df.set_index(['school name', 'department', 'course name'])['topics'].str.get_dummies(';')\
.add_prefix('topics ')\
.reset_index()
輸出:
school name department course name topics 2 topics 3 topics 4 topics 5 topics 1
0 A A1 X 1 0 0 0 1
1 A A1 Y 0 1 0 0 1
2 B B1 Z 1 0 1 0 1
3 C C1 XX 0 0 0 1 1
uj5u.com熱心網友回復:
嘗試使用帶有關鍵字引數的Series.str.split方法。expand=True
uj5u.com熱心網友回復:
嘗試使用np.where(condition,resultiftrue, resultIfFalse)
如下示例鏈接所示
https://www.dataquest.io/blog/tutorial-add-column-pandas-dataframe-based-on-if-else-condition/
uj5u.com熱心網友回復:
嘗試.str.split跟隨pd.crosstab。然后將兩個資料幀附加在一起:
x = df.pop("topics").str.split(r"\s*;\s*").explode()
x = pd.crosstab(x.index, x).add_prefix("topic ")
df = pd.concat([df, x], axis=1)
print(df)
印刷:
school name department course name topic 1 topic 2 topic 3 topic 4 topic 5
0 A A1 X 1 1 0 0 0
1 A A1 Y 1 0 1 0 0
2 B B1 Z 1 1 0 1 0
3 C C1 XX 1 0 0 0 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/522534.html
上一篇:如何迭代熊貓中的特定索引?
