首页 > 解决方案 > 如何使用熊猫从字典中删除行

问题描述

如果我有这样的数据集。

date    PCP1    PCP2    PCP3    PCP4
1/1/1985    0   -99 -99 -99
1/2/1985    0   -99 -99 -99
1/3/1985    0   0   -99 -99
1/4/1985    0   0   -99 -99
1/5/1985    1   -99 1   1
1/6/1985    0   -99 -99 -99
1/7/1985    0   1   -99 0
1/8/1985    0   2   -99 3
1/9/1985    0   -99 -99 -99

我想通过只有这样的日期列和一个 PCP 列来创建新的数据框.. 对于 df1..

df1 = 
date    PCP1
1/1/1985    0
1/2/1985    0
1/3/1985    0
1/4/1985    0
1/5/1985    1
1/6/1985    0
1/7/1985    0
1/8/1985    0
1/9/1985    0

和df2...

df2 = 
date    PCP2
1/1/1985    -99
1/2/1985    -99
1/3/1985    0
1/4/1985    0
1/5/1985    -99
1/6/1985    -99
1/7/1985    1
1/8/1985    2
1/9/1985    -99

等等 df3 .. 和 df4 ......

我想为每个数据框删除带有-99的行,这将导致......

df1 = 
date    PCP1
1/1/1985    0
1/2/1985    0
1/3/1985    0
1/4/1985    0
1/5/1985    1
1/6/1985    0
1/7/1985    0
1/8/1985    0
1/9/1985    0

和df2...

df2 = 
date    PCP2
1/3/1985    0
1/4/1985    0
1/7/1985    1
1/8/1985    2

我不确定我是否做对了,但我编写了以下代码,但我不确定如何在执行 for 循环时删除带有 -99 的行。

# first I created a list of pcp list
n_cols = 4
pcp_list = []
df_names = []
for i in range(1,n_cols):
    item = "PCP" + str(i)
    pcp_list.append(item)
    item_df = "df" + str(i)
    df_names.append(item_df)

# and then I have created a new df for each name on the list by creating a dict
dfs ={}
for dfn, name in zip(df_names, pcp_list):
    dfs[dfn] = pd.DataFrame(df, columns=['date', name])

# and then I was hoping I could remove the rows with -99
for df, name in zip(dfs, pcp_list):
    df[name] = dfs[df[name] = -99]

任何帮助将不胜感激!

谢谢!

标签: pythonpandasdataframefor-loop

解决方案


您可以在字典中创建数据框:

d = {k: v[v != -99].reset_index() for k,v in df.set_index('date').to_dict('series').items()}

建议按名称创建变量,但可以:

for i, (k, v) in enumerate(df.set_index('date').to_dict('series').items()):
    globals()[f'df{i}'] =  v[v != -99].reset_index()

推荐阅读