簡體   English   中英

從一個數據框的列中獲取唯一值,並使用它來過濾另一數據框中的行

[英]Get unique values from one dataframe's column and use this to filter rows in another dataframe

我想在df1中使用一列作為df2的過濾器:

df1 = [('Client', ['A', 'A', 'A', 'B', 'C', 'D', 'D',]),
                    ('Num_Trades', ['1', '2', '3', '1', '1', '1', '1',])
      ]

df1 = pd.DataFrame.from_items(df1)
display(df1)

    Client  Num_Trades
0   A       1
1   A       2
2   A       3
3   B       1
4   C       1
5   D       1
6   D       1

現在從df1中提取uniquie客戶:

mask_array = df1.Client.unique()
mask_array = dataframe=pd.DataFrame(mask_array, columns=['Client']) 
# mask_list = df1['Client'].unique().tolist()
# mask_list = dataframe=pd.DataFrame(mask_list, columns=['Client']) 
display(mask_array)

    Client
0   A
1   B
2   C
3   D

要過濾的樣本數據框:

df2 = [('Client', ['A', 'B', 'A', 'Y',]),
('Product', ['GOVT', 'GOVT', 'GOVT', 'GOVT',]),
('currency_str', ['USD', 'GBP', 'USD', 'NZD',]),
('Amount', ['10', '20', '30', '40',]),
         ]
# create pandas df
df2 = pd.DataFrame.from_items(df2)
display(df2)


        Client  Product currency_str    Amount
0       A       GOVT    USD             10
1       B       GOVT    GBP             20
2       A       GOVT    USD             30
3       Y       GOVT    NZD             40

所需的結果只是客戶在df1中存在的金額上的所有行的總和:

Client  Product currency_str    Amount
A       GOVT    USD             40
B       GOVT    GBP             20

我的代碼產生的'DataFrame'對象是可變的,因此不能將它們散列。 我也嘗試使用數組和列表。 那么,需要對唯一的記錄集執行什么操作才能將它們用作df2的過濾器?

d = [ 
        ('Amount', 'sum')     
    ] 

# aggregate 
mask = df2['Client'].str.contains(mask_list) 
df2 = df2[mask].groupby(['Client','Product','currency_str'])['Amount'].agg(d).reset_index()
display(df2)

您可以使用join| 用於正則表達式, OR如果需要按子字符串過濾:

mask = df2['Client'].str.contains('|'.join(df1.Client.unique()))

或使用isin如果isin值過濾:

mask = df2['Client'].isin(df1.Client.unique())

df2['Amount'] = df2['Amount'].astype(int)
df2 = df2[mask].groupby(['Client','Product','currency_str'])['Amount'].agg(d).reset_index()
print(df2)
  Client Product currency_str  Amount
0      A    GOVT          USD      40
1      B    GOVT          GBP      20

這對我有用。 我注意到數量實際上是一個字符串,因此需要在groupby之前進行理想的轉換。 如果您不能在這里轉換我的解決方案:

創建df1的唯一客戶端列表:

df1['Client'].unique()

array(['A','B','C','D'],dtype = object)

然后使用它在“客戶端”列上過濾df2

df2[
    df2['Client'].isin(df1['Client'].unique())
]

現在添加groupby和lambda來處理字符串量:

df2[
    df2['Client'].isin(df1['Client'].unique())
].groupby(['Client','Product','currency_str'])['Amount'].apply(lambda x: sum([np.int(x) for x in x.values]))

Client  Product  currency_str
A       GOVT     USD             40
B       GOVT     GBP             20
Name: Amount, dtype: int64

注意:

apply(lambda x: sum([np.int(x) for x in x.values]))

執行以下操作。 列數量中的每個值都通過np.int轉換為int並保存在列表中。 然后在該列表上求和。 示例:對於客戶A:groupby返回了金額“ 10”和“ 30”,但您不能對字符串求和。 因此,單獨進行轉換,然后應用sum()。

加:

.to_frame('Amount').reset_index()


    Client  Product     currency_str    Amount
0   A       GOVT        USD             40
1   B       GOVT        GBP             20

暫無
暫無

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

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