Python 遍历数据帧列表以删除特定行

Python 遍历数据帧列表以删除特定行,python,pandas,Python,Pandas,在我先前的问题中 在帮助下,我放弃了1980年以前的那一排。“季节”栏(包含年份)采用以下格式: 2018-19 2017-18 This list would go till 1960 在前面的问题(链接)中,@jezrael给出了一个解决方案,帮助我在1980年之前消除了争吵 我有一个包含30个数据帧的列表(称为list)。我想迭代30个数据帧,并删除1980年之前每个df的所有行。例如,列表中的一个项目是BOS 如果BOS['seash]有: 2018-19 2017-18

在我先前的问题中

在帮助下,我放弃了1980年以前的那一排。“季节”栏(包含年份)采用以下格式:

 2018-19
 2017-18
 This
 list would go
 till 1960
在前面的问题(链接)中,@jezrael给出了一个解决方案,帮助我在1980年之前消除了争吵

我有一个包含30个数据帧的列表(称为
list
)。我想迭代30个数据帧,并删除1980年之前每个
df
的所有行。例如,
列表中的一个项目是
BOS
如果
BOS['seash]
有:

 2018-19
 2017-18
 1959-1960
我应该

2018-19
2017-18
这样的结果应该适用于
列表中的所有数据帧

这是我尝试过的,但出现了错误,否则什么也不会发生:

列表中df的
:
df=df[df['seasure'].str.split('-').str[0].astype(int)>1980]
我的代码怎么了?我是python新手。我认为,通过将
df
分配给变更,它将把它实现到
列表中的每个'
df

谢谢

更新: 我有一个名为
联盟的
列表
。此列表有30个数据帧。我看了jazrael和IMCoin的解决方案。他们俩都工作了。但这是我的要求

在为每个数据帧删除1980年之前的行之后。我希望能够直接使用该数据帧,而不是通过列表。这就是我的意思


#在添加到列表之前
BOS=pd.read\u csv(目录+波士顿表格)
#我有30个不同的城市,每个城市都有一个CSV文件,每个城市都有一个CSV文件
#他们自己的数据帧。波士顿和芝加哥各有30个城市。
所有这30个城市数据帧都已添加到列表
league

根据上述条件过滤城市数据帧后,我希望能够使用过滤后的数据调用
BOS
CHI
。这只是为了便于我开发后续的其他功能

您需要创建过滤数据帧的新列表或重新分配旧列表:

注意:不要使用变量
list
,因为
builtins
(python代码字)

循环版本:

output = []
for df in L:
   df = df[df['Season'].str.split('-').str[0].astype(int) > 1980]
   output.append(df)
如果需要只提取长度为4的第一个整数:

L = [df, df]
L = [df[df['Season'].str.extract('(\d{4})', expand=False).astype(float) > 1980] 
          for df in L]

print (L)
[    Season
0  2018-19
1  2017-18,     Season
0  2018-19
1  2017-18]
编辑:

如果数据具有相同的结构,我建议为区分城市创建一个带有新列的大数据框架:

import glob

files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp).assign(City=os.path.basename(fp).split('.')[0]) for fp in files]
df = pd.concat(dfs, ignore_index=True)
print (df)
          Season           City
0        2018-19   Boston_Sheet
1           This   Boston_Sheet
2  list would go   Boston_Sheet
3      till 1960   Boston_Sheet
4        2018-19  Chicago_Sheet
5        2017-18  Chicago_Sheet
6           This  Chicago_Sheet

df1 = df[df['Season'].str.extract('(\d{4})', expand=False).astype(float) > 1980]
print (df1)
     Season           City
0   2018-19   Boston_Sheet
4   2018-19  Chicago_Sheet
5   2017-18  Chicago_Sheet

df2 = df1[df1['City'] == 'Boston_Sheet']
print (df2)
    Season          City
0  2018-19  Boston_Sheet

df3 = df1[df1['City'] == 'Chicago_Sheet']
print (df3)
     Season           City
4   2018-19  Chicago_Sheet
5   2017-18  Chicago_Sheet

如果需要将每个数据帧分开,可以通过数据帧字典:

import glob

files = glob.glob('files/*.csv')
dfs_dict = {os.path.basename(fp).split('.')[0] : pd.read_csv(fp) for fp in files}

print (dfs_dict)

print (dfs_dict['Boston_Sheet'])
          Season
0        2018-19
1           This
2  list would go
3      till 1960

print (dfs_dict['Chicago_Sheet'])
0   2018-19
1   2017-18
2      This
然后在词典理解中进行处理:

dfs_dict = {k:v[v['Season'].str.extract('(\d{4})', expand=False).astype(float) > 1980] 
                 for k, v in dfs_dict.items()}
print (dfs_dict)
{'Boston_Sheet':     Season
0  2018-19, 'Chicago_Sheet':      Season
0   2018-19
1   2017-18}

print (dfs_dict['Boston_Sheet'])
    Season
0  2018-19

print (dfs_dict['Chicago_Sheet'])
     Season
0   2018-19
1   2017-18

如果要就地修改列表,请执行以下操作:

用于范围内的索引(len(df_列表)):
df_list[index]=df_list[index].loc[df_list[index]['seasure'].str.split('-').str[0].astype(int)>1980]
当您在列表对象本身中循环时,它会在每次迭代中创建一个新对象,并在每次循环中被擦除

如果使用列表的长度进行循环,并通过索引访问数据,则将修改列表本身,而不是使用
为df\u list
中的某些\u copy\u项目进行复制


最简单的例子:

arr=[1,2,3,4,5]
打印(arr)#[1,2,3,4,5]
对于arr中的数字:
数字+=1
打印(arr)#[1,2,3,4,5]
对于范围内的idx(len(arr)):
arr[idx]+=1
打印(arr)#[2,3,4,5,6]

如果可以合并所有数据帧。。。使用
pd.concat(df_list)
,然后使用日期过滤器。这是我的第一个想法,但对于我的应用程序,我需要将这些数据帧分开。如果适合,请查看我的解决方案,您的问题是如何迭代列表。因此我的想法是正确的,但我没有存储修改后的
df
?有没有一种方法可以在没有新列表的情况下做到这一点?(只是好奇)我在筛选日期时出错了。我做了类似的事情(将expand设置为true并键入int。即使在我将其更改为您的建议后,我也会得到一个针对Season的“KeyError”?@abhivemp-这意味着在某些文件中没有列名
Season
,也请检查。您可以通过dfs\u dict.items():print(v.columns.tolist())中的
为k,v测试列名
这是否意味着如果我使用
BOS
我将无法得到过滤结果?@adhivemp这取决于你想做什么。如果你有一个列表,并想修改它。使用我的方法。如果你有一个列表,并想将新值存储到一个新列表中,为了跟踪上一个值,请按照jezrael didI尝试过的方法进行操作。我的原始list完全改变了(我可以通过按索引打印列表进行检查)。但是,当我使用实际的数据帧名称来调用它们时(如
BOS
),我得到了原始的数据帧。我是否做错了什么(首先,我逐行输入你的建议,以便理解。在我认为我做错了什么之后,我只是复制粘贴,得到了相同的结果)我不清楚你到底在问什么,对吗now@abhivemp口述。
dfs_dict = {k:v[v['Season'].str.extract('(\d{4})', expand=False).astype(float) > 1980] 
                 for k, v in dfs_dict.items()}
print (dfs_dict)
{'Boston_Sheet':     Season
0  2018-19, 'Chicago_Sheet':      Season
0   2018-19
1   2017-18}

print (dfs_dict['Boston_Sheet'])
    Season
0  2018-19

print (dfs_dict['Chicago_Sheet'])
     Season
0   2018-19
1   2017-18