[英]How to find minimum value in a column based on condition in an another column of a 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.merge
將df2
中的切片與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.