![](/img/trans.png)
[英]Subset pandas dataframe on multiple columns based on values from another dataframe
[英]Taking columns from a dataframe based on row values of another dataframe in Python?
我正在使用 2 個數據框,我正在嘗試根據df2
的行值從df1
創建多個 dfs。 我找不到有關如何完成此操作的任何文檔。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
'A': 'foo bar bro bir fin car zoo loo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2
})
print(df1)
df2 = pd.DataFrame({
'col1': 'foo bar bro bir'.split(),
'col2': 'B B C B '.split(),
'col3': 'D C D D '.split()
})
print(df2)
如何創建一個名為'foo'
的 dataframe ,它只包含df1
中的B
和D
列(來自df2
的輸入)。 另一個 dataframe 'bar'
, 'bro'
& 'bir'
也是如此。 因此, df_foo
和df_bar
的 output 的示例將是
df_foo = pd.DataFrame({'B': 'one', 'D': 0})
df_bar = pd.DataFrame({'B': 'one', 'C': 1})
我找不到任何關於如何做到這一點的文檔。
將loc
用於(基於標簽的)索引怎么樣? 一個例子:
df1_ = df1.set_index('A') # use column A to "rename" rows.
print(df1_.loc[('foo',), ('B', 'D')]) # use `.loc` to access values via their label coordinates.
#
# B D
# A
# foo one 0
因此,要構建一個新的 dataframe 通過將df2
的行作為輸入在df1
中使用,您可以這樣做
df_all = pd.concat((
df1_.loc[(row.col1,), (row.col2, row.col3)]
for _, row in df2.iterrows()
))
print(df_all)
# B C D
# A
# foo one NaN 0.0
# bar one 1.0 NaN
# bro NaN 2.0 4.0
# bir three NaN 6.0
最后,一個帶有'bar'
的示例(將'bar'
替換為'foo'
或其他)
df_bar = df_all.loc['bar'].dropna()
print(df_bar)
# B one
# C 1
# Name: bar, dtype: object
# or, to keep playing with dataframes
print( df_all.loc[('bar',), :].dropna(axis=1) )
# B C
# A
# bar one 1.0
如果您有超過 3 列,假設df1
中有 70-80 列,您可以做的是
idx = 'col1'
cols = [c for c in df2.columns.tolist() if c != idx]
df_agno = pd.concat((
df1_.loc[
(row[idx],), row[cols]
] for _, row in df2.iterrows()
))
print(df_agno)
# B C D
# A
# foo one NaN 0.0
# bar one 1.0 NaN
# bro NaN 2.0 4.0
# bir three NaN 6.0
print( df_agno.loc[('bar',), :].dropna(axis=1) )
# B C
# A
# bar one 1.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.