我有一個這種格式的 json
{
"userobject": ["Nike", "NY", "", "Actor", "Artist"]
}
我有一個資料框,其中所有列都有值,除了在上面的 jsonCountry中表示為空的列。""
我想從 json 中獲取具有相似值的資料框中的所有行。我的代碼:
org = userobject[0]
region = userobject[1]
country = userobject[2]
title = userobject[3]
dept = userobject[4]
newdf = df[(df['Organization'] == org) & (df['Region'] == region) & (df['Country']== country)) & (df['Title'] == title) & (df['Department'] == dept)]
但這會破壞我的代碼,并且只有在我洗掉這(df['Country']== country))部分時才有效。但我還需要使用這個子句,因為我的資料框應該從 json 中動態過濾,對于某些資料框,國家值將在那里。有人可以幫我解決這個問題嗎
uj5u.com熱心網友回復:
您可以使用reduce動態構建條件:
from functools import reduce
cols = ['Organization', 'Region', 'Country', 'Title', 'Department']
json_dict = {"userobject": ["Nike", "NY", "", "Actor", "Artist"]}
cond = reduce(
lambda r, p: r & (df[p[0]] == p[1]),
((c, v) for c, v in zip(cols, json_dict["userobject"]) if v != ""),
pd.Series(True, index=df.index)
)
newdf = df[cond]
reduce將從初始值開始: 最后一個引數,這里是一個用( )r填充的系列。然后它將通過作為第一個引數給出的函式連續“減少”給定的迭代,即第二個引數。可迭代物件中的對是(列名,來自用戶物件的對應值)()按值過濾:如果值是,則將其過濾掉。該函式采用已經構建的條件并添加到它。Truepd.Series(True, index=df.index)(c, v)""lambdar& (df[c] == v)
uj5u.com熱心網友回復:
在創建掩碼之前,您必須先null用空字串填充值。此外,您可以通過eq將列與userobject串列進行比較來簡化代碼,然后all沿列軸減少布爾掩碼:
cols = ['Organization', 'Region', 'Country', 'Title', 'Department']
df[df[cols].fillna('').eq(userobject).all(1)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442230.html
上一篇:如何正確查找df中哪些行的時間值與Python上的時間間隔匹配?熊貓相關
下一篇:選擇值小于總和分組值50%的行
