当前位置: 首页 > 知识库问答 >
问题:

基于来自另一个数据帧的值将数据帧拆分为多个数据帧

勾裕
2023-03-14

我有两个数据帧df1和df2。df1就像一个具有以下值的字典

Ticker          INDUSTRY_SECTOR
TLRA_Equity     Communications
KAMN_Equity     Industrial
B_Equity        Industrial
ARNC_Equity     Industrial
RC_Equity       Consumer, Non-cyclical
DAR_Equity      Consumer, Non-cyclical

df2具有以下值:

  Date   TLRA_Equity  KAMN_Equity  B_Equity  ARNC_Equity RC_Equity DAR_Equity
1/1/2000  10              20        30          40        50          60
2/1/2000  15              25        35          45        55          65
3/1/2000  17              27        37          47        57          67

我想基于df1数据帧中的INDUSTRY\u SECTOR,将df2拆分为3个新的数据帧。

  • 日期,TLRA_权益栏应位于通信数据框

预期产出:

>

Date   TLRA_Equity  
1/1/2000  10            
2/1/2000  15            
3/1/2000  17             

工业数据帧

Date    KAMN_Equity  B_Equity  ARNC_Equity 
1/1/2000  20          30          40       
2/1/2000  25          35          45       
3/1/2000  27          37          47    

消费者,非周期性数据帧

Date          RC_Equity DAR_Equity
1/1/2000        50          60
2/1/2000        55          65
3/1/2000        57          67

请让我知道如何有效地做。我想做的是连接列名,例如Communications_TLRA_Equity,然后根据列名的前半部分分割数据帧。

代码:

col_names = df2.columns.values.tolist()
d_cols = df2.columns.map(df1.set_index('Ticker')['INDUSTRY_SECTOR'].get)
print(d_cols)
df.columns = [d_cols + "_"  str(col) for col in df.columns]

for sector, df_sector in df.columns.str.split('_').str[0].tolist():
     print(sector)
     print(df_sector)

但这很复杂。需要更好的解决方案。

共有2个答案

权韬
2023-03-14

考虑创建一个帧的dicing,关键是您的'INDUSTRY_SECTOR'名称。

首先创建一个INDUSTRY_SECTOR的判决:滴答栏

g = df1.groupby('INDUSTRY_SECTOR')['Ticker'].apply(list).to_dict()
print(g)

{'Communications': ['TLRA_Equity'], 'Consumer, Non-cyclical': ['RC_Equity', 'DAR_Equity'], 'Industrial': ['KAMN_Equity', 'B_Equity', 'ARNC_Equity']}

然后创建一个听写理解:

frames = {k:df2.set_index('Date')[v] for k,v in g.items()}

print(frames)

{'Communications':           TLRA_Equity
Date                 
1/1/2000           10
2/1/2000           15
3/1/2000           17,
 'Consumer, Non-cyclical':           RC_Equity  DAR_Equity
Date                           
1/1/2000         50          60
2/1/2000         55          65
3/1/2000         57          67,
 'Industrial':           KAMN_Equity  B_Equity  ARNC_Equity
Date                                        
1/1/2000           20        30           40
2/1/2000           25        35           45
3/1/2000           27        37           47}

正如@Parfait所指出的,要包含Date列,需要将其设置为dict理解中的索引。如果不想将日期作为索引,请使用:

frames = {k:df2.set_index('Date')[v].reset_index() for k,v in g.items()}
冯俊英
2023-03-14

您可以使用groupby创建数据帧列表,

dfs = [df2.set_index('Date')[ticker].reset_index() for ticker in df1.groupby('INDUSTRY_SECTOR').Ticker.apply(list)]


dfs[0]

    Date    TLRA_Equity
0   1/1/2000    10
1   2/1/2000    15
2   3/1/2000    17


dfs[1]

    Date    RC_Equity   DAR_Equity
0   1/1/2000    50      60
1   2/1/2000    55      65
2   3/1/2000    57      67

dfs[2]


    Date    KAMN_Equity B_Equity    ARNC_Equity
0   1/1/2000    20      30          40
1   2/1/2000    25      35          45
2   3/1/2000    27      37          47
 类似资料:
  • 我有两个数据帧df1和df2 df1如下 df2就像 我想根据df2中与df1中的列名匹配的单元格值将值从df1复制到df2,所以我的df3应该看起来像 df3 基本上,我想根据df2的单元格值(df1中的列名)从df1复制df2中的列 如果它仍然令人困惑,请告诉我

  • 我正面临这个问题,其中我有一个数据帧,比如: 和另一个数据帧: 现在我想要的是,将df2的列插入到df1的特定位置,这样df1就变成了(实际上一个新的df也会起作用): 我现在通过创建一个新的空df来实现这一点,然后迭代这两个df的列,然后依次添加每一列。这是低效的、丑陋的,并且违背了数据流的全部目的。所以我很想知道,这个已经有方法了吗?我不确定这样的问题是否已经在这里得到了回答,但我肯定我没有找

  • 我有一个像下面这样的DataFrame,标识符作为现有DateIndex顶部的列。 我的目标是为除id之外的每一列(a和B)创建一个新的子DataFrames,其中dateIndex作为单个索引,id(foo,bar)作为列名。预期产出如下所示:

  • 我有一个关于熊猫以及正确索引和替换值的问题。 我有两个数据帧,df1和df2,具有相同的列(Col1、Col2、Col3和Col4)。 在df1中,我想用另一个值(比如100)替换与df2中其他列(Col1、Col2和Col3)的值匹配的行中Col4中的值。 生成的df1看起来像这样: 我试过这样的方法: 但是我得到了错误,我不确定这是否达到了我想要的。

  • 我有两个数据框,都包含英文和中文单词字符串,我想知道其中一个是另一个的子集:

  • 我有两个不同列数和行数的CSV文件。第一个CSV文件有M列和N行,第二个文件有H列和G行。一些列具有相同的名称。 null 另外,如果两个CSV文件有两个数据帧,并希望这样做,例如,如果我将第一个CSV加载到中,将第二个加载到中,然后希望合并到,类似于上面的示例。