[英]Extracting specific rows from a data frame
我有一個帶有兩列“ ids”和“ names”的數據框df1-
ids names
fhj56 abc
ty67s pqr
yu34o xyz
我有另一個數據框df2,其中某些列是-
user values
1 ['fhj56','fg7uy8']
2 ['glao0','rt56yu','re23u']
3 ['fhj56','ty67s','hgjl09']
我的結果應該給我那些來自df2的用戶,這些用戶的值至少包含來自df1的ID之一,並告訴哪些ID負責將其放入結果表中。 結果應類似於-
user values_responsible names
1 ['fhj56'] ['abc']
3 ['fhj56','ty67s'] ['abc','pqr']
用戶2不在結果表中,因為df1中不存在任何值。
我試圖做到這一點如下-
df2.query('values in @df1.ids')
但這似乎效果不佳。
您可以通過行迭代,然后使用.loc
連同isin
以找到匹配的行df2
。 我將此過濾后的數據框轉換為字典
ids = []
names = []
users = []
for _, row in df2.iterrows():
result = df1.loc[df1['ids'].isin(row['values'])]
if not result.empty:
ids.append(result['ids'].tolist())
names.append(result['names'].tolist())
users.append(row['user'])
>>> pd.DataFrame({'user': users, 'values_responsible': ids, 'names': names})[['user', 'values_responsible', 'names']]
user values_responsible names
0 1 [fhj56] [abc]
1 3 [fhj56, ty67s] [abc, pqr]
或者,對於整潔的數據:
ids = []
names = []
users = []
for _, row in df2.iterrows():
result = df1.loc[df1['ids'].isin(row['values'])]
if not result.empty:
ids.extend(result['ids'].tolist())
names.extend(result['names'].tolist())
users.extend([row['user']] * len(result['ids']))
>>> pd.DataFrame({'user': users, 'values_responsible': ids, 'names': names})[['user', 'values_responsible', 'names']])
user values_responsible names
0 1 fhj56 abc
1 3 fhj56 abc
2 3 ty67s pqr
使用取消嵌套列表單元格的想法進行嘗試。
Temp_unnest = pd.DataFrame([[i, x]
for i, y in df['values'].apply(list).iteritems()
for x in y], columns=list('IV'))
Temp_unnest['user']=Temp_unnest.I.map(df.user)
df1.index=df1.ids
Temp_unnest.assign(names=Temp_unnest.V.map(df1.names)).dropna().groupby('user')['V','names'].agg({(lambda x: list(x))})
Out[942]:
V names
<lambda> <lambda>
user
1 [fhj56] [abc]
3 [fhj56, ty67s] [abc, pqr]
我將重構您的第二個數據框(實質上是對數據庫進行規范化)。 就像是
user gid id
1 1 'fhj56'
1 1 'fg7uy8'
2 1 'glao0'
2 1 'rt56yu'
2 1 're23u'
3 1 'fhj56'
3 1 'ty67s'
3 1 'hgjl09'
然后,您要做的就是將id列上的第一個和第二個數據幀合並。
r = df2.merge(df1, left_on='id', right_on='ids', how='left')
您可以排除某些ID不具有匹配名稱的所有ID。
r[~r[gid].isin( r[r['names'] == None][gid].unique() )]
其中r[r['names'] == None][gid].unique()
查找所有沒有名字的小女孩,然后r[~r[gid].isin( ... )]
只r[~r[gid].isin( ... )]
isin
list參數中。
如果您有更多的ID組,第二個表可能看起來像
user gid id
1 1 'fhj56'
1 1 'fg7uy8'
1 2 '1asdf3'
1 2 '7ada2a'
1 2 'asd341'
2 1 'glao0'
2 1 'rt56yu'
2 1 're23u'
3 1 'fhj56'
3 1 'ty67s'
3 1 'hgjl09'
相當於
user values
1 ['fhj56','fg7uy8']
1 ['1asdf3', '7ada2a', 'asd341']
2 ['glao0','rt56yu','re23u']
3 ['fhj56','ty67s','hgjl09']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.