根据Python中另一个数据框的行值从一个数据框获取列?

时间:2019-09-27 11:42:15

标签: python

我正在使用2个数据帧,我试图根据df1的行值从df2创建多个df。我找不到有关如何完成此操作的任何文档。

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中的Ddf1列(它们是来自df2的输入)。 另一个数据帧'bar''bro''bir'也是一样。因此,df_foodf_bar的输出示例为

df_foo = pd.DataFrame({'B': 'one', 'D': 0})

df_bar = pd.DataFrame({'B': 'one', 'C': 1})

我找不到有关如何完成此操作的任何文档。

1 个答案:

答案 0 :(得分:0)

使用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列以上,例如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