Python 从文件中选择数据帧的某些列

Python 从文件中选择数据帧的某些列,python,pandas,Python,Pandas,我有一个数据帧df Fruit Apple Orange Banana Pear basket1 0 1 10 15 basket2 1 5 7 10 basket3 10 15 0 0 我选择了另一个数据帧 type1 type2 type3 Apple Apple Orange Orange Pear Apple

我有一个数据帧df

Fruit   Apple   Orange   Banana  Pear

basket1   0        1       10     15

basket2   1        5        7     10

basket3   10       15       0      0
我选择了另一个数据帧

type1   type2   type3

Apple   Apple   Orange

Orange  Pear    Apple

        Banana 
我想根据select中的3列将dataframe df拆分为3

示例df_类型1应为

Fruit   Apple   Orange   

basket1   0        1      

basket2   1        5      

basket3   10       15  
df_类型2应为

Fruit   Apple   Banana  Pear

basket1   0       10     15

basket2   1        7     10

basket3   10       0      0
我已经用下面的代码将df和select加载到pandas中

import pandas as pd
df = pd.read_csv("df.txt",sep = "\t",header =0)
select = pd.read_csv("select.txt",sep ="\t",header =0)
我不确定下一个合并命令

请尝试以下操作:

给定指定的数据帧

df = pd.DataFrame([[0,1,10,15],[1,5,7,10],[10,15,0,0]], columns=['Apple','Orange','Banana','Pear'], index=['basket1','basket2','basket3'])

select = pd.DataFrame([['Apple','Apple','Orange'],['Orange','Pear','Apple'],['','Banana','']], columns=['type1','type2','type3'])
解决方案:

new_dfs = {}

for col in select.columns:

    fruit_list = []

    for index in select.index:

        if select.loc[index,col] != '':

            fruit_list.append(select.loc[index,col])

    new_dfs[col] = df[[x for x in fruit_list]]
这将为您提供一个新的dic_dfs,其中包含每个所需的数据帧。 样本输出:

new_dfs['type1']

我将创建另一个具有多索引的数据帧

pd.concat(
    [df[select.T.stack()[t]] for t in select],
    axis=1, keys=select
)

  type1        type2              type3      
  Apple Orange Apple Pear Banana Orange Apple
0     0      1     0   15     10      1     0
1     1      5     1   10      7      5     1
2    10     15    10    0      0     15    10
分解

pd.concat将连接到一个轴上 select.T.stack将select转换为更便于切片的内容 对于select中的t,通过select中的列名循环 keys=选择keys参数将采用类似列表的方式。在该上下文中,select将返回列名。 以您想要的方式访问

d1 = pd.concat(
    [df[select.T.stack()[t]] for t in select],
    axis=1, keys=select
)

d1['type1']

   Apple  Orange
0      0       1
1      1       5
2     10      15
一次一个地访问所需内容,而无需存储新结构

df[select.T.stack().type1]

   Apple  Orange
0      0       1
1      1       5
2     10      15

您可以从数据框中创建值列表,选择:

type1 = list(select['type1'].dropna())
type2 = list(select['type2'].dropna())
type3 = list(select['type3'].dropna())
使用这些列表选择df的切片

 df_type1 = df[type1]
 df_type2 = df[type2]
 df_type3 = df[type3]
df_类型1

    Apple   Orange
0   0   1
1   1   5
2   10  15
等等

编辑:

您可以使用isin来处理KeyError

type1 = select.type1[select.type1.isin(df.columns)].tolist()
type2 = select.type2[select.type2.isin(df.columns)].tolist()
type3 = select.type3[select.type3.isin(df.columns)].tolist()

df_type1 = df[type1]
df_type2 = df[type2]
df_type3 = df[type3]

@Ssank查看我更新的帖子是否满足您的要求。当我运行concat命令时,我得到一个错误回溯到最近的调用last:KeyError:['Apple''Orange']不在索引中。当我尝试df_type1=df[type1]时,我得到一个键错误,KeyError:['Apple''Orange']不在索引中,您可以打印df.columns的输出。tolist?是的,输出是[‘水果’、‘苹果’、‘橘子’、‘香蕉’、‘梨’]这里的代码工作正常,必须有一些输入错误。由于列名匹配,第一个df名为df,没有任何大写字母吗?对于上面的示例,代码工作正常。但是,如果type1有Apple、Orange和Tangerine,而不在df中,则代码会给出错误键error:['Tangerine']不在索引中。是否有方法告诉代码忽略select中的行,这些行不是df中的列?谢谢
type1 = select.type1[select.type1.isin(df.columns)].tolist()
type2 = select.type2[select.type2.isin(df.columns)].tolist()
type3 = select.type3[select.type3.isin(df.columns)].tolist()

df_type1 = df[type1]
df_type2 = df[type2]
df_type3 = df[type3]