簡體   English   中英

如何在另一個 dataframe 中根據條件添加列值?

[英]How to add column value based on condition in another dataframe?

我有一個帶有主要固定位置數據的 dataframe:

id    name 
1      BEL
2      BEL
3      BEL
4      NYC
5      NYC
6      NYC
7      BER
8      BER      

我還有第二個 dataframe 在這里我得到每個 id 和 city 的值,就像這樣(注意,這個 dataframe 比主數據框長):

id    name  value
1      BEL   9
2      BEL   7
3      BEL   3
4      NYC   76
5      NYC   76
6      NYC   23
7      BER   76
8      BER   2 
3      BEL   7
4      NYC   5
5      NYC   4
6      NYC   2

我的目標是,如果值大於 10,我想檢查第二個 dataframe。 如果大於 10,我想在第一個 dataframe 中添加一列 ['not_ok'],例如 1 表示不正常。 我怎樣才能做到這一點?

我可以用dff['not_ok'] = np.where(dff['value'] > 10, '1', '0')過濾第二個 dataframe 但由於 dff 更長我不知道如何獲得該信息在第一個 dataframe 中。

我的目標看起來像這樣:

id    name  is_ok
1      BEL   1
2      BEL   1
3      BEL   1
4      NYC   0
5      NYC   0
6      NYC   0
7      BER   0
8      BER   1  

假設您的第一個(較短的)daraframe 稱為'df_v1' ,第二個(較長的)稱為'df_v2'

'df_v2'上准備這樣的列:

df_v2["not_ok"] = df_v2["value"].apply(lambda x: x > 10)

然后,像這樣加入'id''name'

df_v1.merge(df_v2[["id", "name", "not_ok"]], on=["id", "name"], how="left")

要達到所需的 output 您可以嘗試如下:

import pandas as pd

data = {'id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8}, 
        'name': {0: 'BEL', 1: 'BEL', 2: 'BEL', 3: 'NYC', 4: 'NYC', 
                 5: 'NYC', 6: 'BER', 7: 'BER'}
        }
df = pd.DataFrame(data)

data2 = {'id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 
                7: 8, 8: 3, 9: 4, 10: 5, 11: 6}, 
         'name': {0: 'BEL', 1: 'BEL', 2: 'BEL', 3: 'NYC', 4: 'NYC', 
                  5: 'NYC', 6: 'BER', 7: 'BER', 8: 'BEL', 9: 'NYC', 
                  10: 'NYC', 11: 'NYC'}, 
         'value': {0: 9, 1: 7, 2: 3, 3: 76, 4: 76, 5: 23, 6: 76, 
                   7: 2, 8: 7, 9: 5, 10: 4, 11: 2}
         }
df2 = pd.DataFrame(data2)

df = df.merge(df2[df2['value'].gt(10)], on=['id', 'name'], how='left')\
    .rename(columns={'value':'is_ok'})
df['is_ok'] = df['is_ok'].isna().astype(int)

print(df)

   id name  is_ok
0   1  BEL      1
1   2  BEL      1
2   3  BEL      1
3   4  NYC      0
4   5  NYC      0
5   6  NYC      0
6   7  BER      0
7   8  BER      1

解釋:

  • 使用Series.gt獲取 boolean pd.Series ,我們使用它從d2到 select 僅滿足條件value > 10的行。
  • 使用df.mergedf2中的切片與df合並,並將列value重命名為is_ok ( df.rename )。
  • 我們現在有一個包含NaN值的列,其中id, name和值> 10沒有匹配項。 使用Series.isna將此列轉換為布爾值。
  • 最后,我們可以鏈接.astype(int)來改變True | False True | False 1 | 0 1 | 0 .

您可以使用.lt(10)方法獲取小於 10 的值(將 <10 的值標記為 1,將 >10 的值標記為 0)。 然后使用min() function 按 id 分組,以在第二個 DataFrame 中重復 id 的情況下保持最小值(此處為 0)。 這是代碼:

import pandas as pd

df1 = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6, 7, 8], 
                    'name': ['BEL', 'BEL', 'BEL', 'NYC', 'NYC', 'NYC', 'BER', 'BER']})
df2 = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6, 7, 8, 3, 4, 5, 6],
                    'name': ['BEL', 'BEL', 'BEL', 'NYC', 'NYC', 'NYC', 'BER', 'BER', 'BEL', 'NYC', 'NYC', 'NYC'],
                   'value': [9, 7, 3, 76, 76, 23, 76, 2, 7, 5, 4, 2]})

df2['is_ok'] = df2['value'].lt(10).astype(int)
df3 = df2[['id', 'name', 'is_ok']].groupby('id').min().reset_index()

print(df3)
# If you want to merge it with the first DataFrame
# df1 = df1.merge(df3[["id", "is_ok"]], on=["id"])
# print(df1)

Output:

    id name  is_ok
0   1  BEL      1
1   2  BEL      1
2   3  BEL      1
3   4  NYC      0
4   5  NYC      0
5   6  NYC      0
6   7  BER      0
7   8  BER      1

暫無
暫無

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

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