python - 根据 Python 中另一个数据框的行值从数据框中获取列?
问题描述
我正在使用 2 个数据框,我正在尝试df1
根据df2
. 我找不到有关如何完成此操作的任何文档。
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'
仅包含列B
和D
in df1
(来自 的输入df2
)。另一个数据框也是如此'bar'
,'bro'
& 'bir'
。df_foo
所以&的输出示例df_bar
是
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
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 列,比如说 70-80 列df1
,你可以做的是
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