我正在使用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
中的D
和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})
我找不到有关如何完成此操作的任何文档。
答案 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