簡體   English   中英

根據 Python 中另一個 dataframe 的行值從 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中的BD列(來自df2的輸入)。 另一個 dataframe 'bar''bro' & 'bir'也是如此。 因此, df_foodf_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM