我有一個大資料框,其中的行在字串列中包含一個 ID。我想根據包含 ID 作為列名的 0/1 矩陣減少資料框中的行。為了說明,我創建了一個資料框df1:
import pandas as pd
df1 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-03', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-05', '2021-01-05', '2021-01-05'],
'ID':['R: ID1', 'ID2_P', 'L_ID2', 'ID1.I', 'RZ:ID3', 'ID1', 'P ID2', 'ID3 4K', 'ID1', 'U_ID1', 'ID2:PD', 'ID3=2D'],
'Ratings':[9.0, 8.0, 5.0, 3.0, 2, 3, 6, 5, 4, 10, 3, 6]})
和一個m1包含 0 和 1的矩陣:
m1 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],
'ID1':[0,0,1,1,1],
'ID2':[1,1,1,1,0],
'ID3':[0,0,0,0,1]})
以 為條件m1,資料幀df1需要減少為df2:
df2 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-01', '2021-01-03', '2021-01-03', '2021-01-05', '2021-01-05', '2021-01-05'],
'ID':['ID2_P', 'L_ID2', 'ID1.I', 'P ID2', 'ID1', 'U_ID1', 'ID3=2D'],
'Ratings':[8.0, 5.0, 3, 6, 4, 10, 6]})
到目前為止,我嘗試df1使用 a遍歷行,for loop但無法獲得結果。
非常感謝您的建議!
uj5u.com熱心網友回復:
首先DataFrame.melt與過濾器1行一起使用:
df2 = m1.melt('Date', var_name='ID1').query('value == 1')
print (df2)
Date ID1 value
2 2021-01-03 ID1 1
3 2021-01-04 ID1 1
4 2021-01-05 ID1 1
5 2021-01-01 ID2 1
6 2021-01-02 ID2 1
7 2021-01-03 ID2 1
8 2021-01-04 ID2 1
14 2021-01-05 ID3 1
然后得到ID的df2["ID1"].unique()在Series.str.extract:
df1['ID1'] = df1['ID'].str.extract(f'({"|".join(df2["ID1"].unique())})', expand=False)
最后通過Date和ID1在內部默認 join by 中過濾DataFrame.merge,洗掉輔助ID1列:
df = df1.merge(df2[['Date','ID1']]).drop('ID1', axis=1)
print (df)
Date ID Ratings
0 2021-01-01 ID2_P 8.0
1 2021-01-01 L_ID2 5.0
2 2021-01-03 ID1 3.0
3 2021-01-03 P ID2 6.0
4 2021-01-05 ID1 4.0
5 2021-01-05 U_ID1 10.0
6 2021-01-05 ID3=2D 6.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353836.html
下一篇:R僅保持行達到特定條件
