Python 从文件中选择数据帧的某些列
我有一个数据帧dfPython 从文件中选择数据帧的某些列,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
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]