首页 > 解决方案 > 根据 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'仅包含列BDin 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})

我找不到任何关于如何做到这一点的文档。

标签: python

解决方案


使用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


推荐阅读