我正在開發一個具有如下 DataFrame 的 Python 專案:
row1 = ['BBB', 'AAA', 'CCC']
row2 = ['CCC']
row3 = ['DDD', 'AAA']
row4 = ['DDD', 'BBB', 'AAA', 'EEE', 'CCC']
row5 = ['EEE', 'AAA', 'EEE', 'CCC']
data = {'List': [row1, row2, row3, row4, row5],
'Path_length': [3, 1, 2, 5, 4]}
df = pd.DataFrame(data)
這導致:
| | List | Path_length |
| 0 | ['BBB', 'AAA', 'CCC'] | 3 |
| 1 | ['CCC'] | 1 |
| 2 | ['DDD','AAA'] | 2 |
| 3 | ['DDD','BBB', 'AAA', 'EEE', 'CCC'] | 5 |
| 4 | ['EEE', 'AAA', 'EEE', 'CCC'] | 4 |
該任務包括生成以下 DataFrame:
| | Content | Unique | Started | Middleway | Finished |
| 0 | AAA | 0 | 0 | 3 | 1 |
| 1 | BBB | 0 | 1 | 1 | 0 |
| 2 | CCC | 1 | 0 | 0 | 3 |
| 3 | DDD | 0 | 2 | 0 | 0 |
| 4 | EEE | 0 | 1 | 2 | 0 |
其中列包含以下內容:
- 內容:在串列中找到的元素
- Unique:元素在串列中單獨出現的次數
- Started:元素在開頭出現的次數
- Finished:元素最后出現的次數
- Middleway:元素在開始和結束之間出現的次數。
我有點為這個任務找到了解決方案,但由于我使用了很多回圈函式,我無法將該演算法應用于更大的資料庫,因為時間處理太高了。您能否通過建議解決此任務的代碼來幫助我?
uj5u.com熱心網友回復:
這是一種方法:
您可以mask使用長度為 1 的路徑(將條件為 True 的值替換為空字串"",以便您可以explode在串列中計算其中的值)。
然后對于這些行,使用 . 計算“Started”、“Middleway”和“Finished”值value_counts。
然后,對于長度為 1 的行,計算“唯一”值。
最后,洗掉虛擬""索引,sort并重新排列列以獲得所需的結果:
masked_df = df['List'].mask(df['Path_length']==1, '')
out = masked_df.explode().value_counts().to_frame().rename(columns={'List': 'Finished'}).rename_axis(index=['Content'])
out['Started'] = masked_df.str[0].value_counts()
out['Middleway'] = masked_df.str[1:-1].explode().value_counts()
out['Finished'] -= out[['Started','Middleway']].sum(axis=1)
out['Unique'] = df['List'].where(df['Path_length']==1, '').explode().value_counts()
out = out.drop(index='').fillna(0).astype(int).sort_index().reset_index()[['Content','Unique','Started','Middleway','Finished']]
輸出:
Content Unique Started Middleway Finished
0 AAA 0 0 3 1
1 BBB 0 1 1 0
2 CCC 1 0 0 3
3 DDD 0 2 0 0
4 EEE 0 1 2 0
uj5u.com熱心網友回復:
另一種解決方案。首先我們在 List 列上應用 enumerate,分解它,然后 sum() 布爾列:
df = df.assign(List=df.List.apply(lambda x: [*enumerate(x, 1)])).explode("List")
df[["tmp", "Content"]] = df["List"].apply(pd.Series)
df["Unique"] = df.tmp.eq(1).eq(df.Path_length)
df["Started"] = df.tmp.eq(1) & ~df.Unique
df["Middleway"] = df.tmp.ne(1) & df.tmp.ne(df.Path_length)
df["Finished"] = df.tmp.eq(df.Path_length) & ~df.Unique
print(df.groupby("Content").sum().iloc[:, 2:].reset_index())
印刷:
Content Unique Started Middleway Finished
0 AAA 0 0 3 1
1 BBB 0 1 1 0
2 CCC 1 0 0 3
3 DDD 0 2 0 0
4 EEE 0 1 2 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425653.html
上一篇:從范圍谷歌表格中提取串列
下一篇:將多嵌套字典串列轉換為資料框
