基本上,我有从csv文件在熊猫中读取的美国人口普查数据。 现在,我必须编写一个函数,从csv文件中获得的表中以特定方式查找县(而不是要解释,因为那不是问题所在),然后返回这些县。
我的尝试:
我所做的是,我创建了带有列名(函数必须返回)的列表,然后使用if语句在for循环中应用了特定条件,以读取它们各自所需的所有列的条目清单。现在,我创建了一个新的DataFrame,我想从列表中读取条目到这个新的DataFrame中。我尝试使用相同的for循环来完成此操作,但都是徒劳的,试图使Series脱离那些列表,并尝试将它们作为参数传递给DataFrame,仍然全部徒然,使DataFrame脱离那些列表,并尝试使用append( )来串联它们,但仍然都是徒劳的。任何帮助,将不胜感激。
代码:
#idxl = list()
#st = list()
#cty = list()
idx2 = 0
cty_reg = pd.DataFrame(columns = ('STNAME', 'CTYNAME'))
for idx in range(census_df['CTYNAME'].count()):
if((census_df.iloc[idx]['REGION'] == 1 or census_df.iloc[idx]['REGION'] == 2) and (census_df.iloc[idx]['POPESTIMATE2015'] > census_df.iloc[idx]['POPESTIMATE2014']) and census_df.loc[idx]['CTYNAME'].startswith('Washington')):
#idxl.append(census_df.index[idx])
#st.append(census_df.iloc[idx]['STNAME'])
#cty.append(census_df.iloc[idx]['CTYNAME'])
cty_reg.index[idx2] = census_df.index[idx]
cty_reg.iloc[idxl2]['STNAME'] = census_df.iloc[idx]['STNAME']
cty_reg.iloc[idxl2]['CTYNAME'] = census_df.iloc[idx]['CTYNAME']
idx2 = idx2 + 1
cty_reg
人口普查表图片:
样品表:
REGION STNAME CTYNAME
0 2 "Wisconsin" "Washington County"
1 2 "Alabama" "Washington County"
2 1 "Texas" "Atauga County"
3 0 "California" "Washington County"
样品输出:
STNAME CTYNAME
0 Wisconsin Washington County
1 Alabama Washington County
很抱歉,我对美国各州和县的了解不足,所以我只是将州名和县随机放在样本表中,只是为了向您展示我要从中得到什么。感谢您的高级帮助。
答案 0 :(得分:1)
如果我正确阅读了代码中的逻辑,则要根据以下条件选择行:
REGION
应该是1
或2
POPESTIMATE2015
> POPESTIMATE2014
CTYNAME
必须以"Washington"
开头通常,Pandas使您可以轻松地根据条件选择行,而不必遍历数据框:
df = census_df[
((df.REGION == 1) | (df.REGION == 2)) & \
(df.POPESTIMATE2015 > POPESTIMATE2014) & \
(df.CTYNAME.str.startswith('Washington'))
]
答案 1 :(得分:1)
OP中发布的源DF中缺少一些列。但是,阅读循环我根本不需要循环。需要三个过滤器-REGION
,POPESTIMATE2015
和CTYNAME
。如果我了解OP中的逻辑,那么在没有循环的情况下应该是可行的
选项1-原始答案
print df.loc[
(df.REGION.isin([1,2])) & \
(df.POPESTIMATE2015 > df.POPESTIMATE2014) & \
(df.CTYNAME.str.startswith('Washington')), \
['REGION', 'STNAME', 'CTYNAME']]
选项2-将and
与pd.eval
一起使用
q = pd.eval("(df.REGION.isin([1,2])) and \
(df.POPESTIMATE2015 > df.POPESTIMATE2014) and \
(df.CTYNAME.str.startswith('Washington'))", \
engine='python')
print df.loc[q, ['REGION', 'STNAME', 'CTYNAME']]
选项3-将and
与df.query
一起使用
regions_list = [1,2]
dfq = df.query("(REGION==@regions_list) and \
(POPESTIMATE2015 > POPESTIMATE2014) and \
(CTYNAME.str.startswith('Washington'))", \
engine='python')
print dfq[['REGION', 'STNAME', 'CTYNAME']]
答案 2 :(得分:1)
假设您要选择某种满足条件的行,那么只需说select(row)
,如果选择此函数,则返回True
,否则返回False
。我不会推断出它是什么,因为您明确地说这并不重要
然后您想要该行的STNAME和CTYNAME。
这就是您要执行的操作:
your_new_df = census_df[census_df.apply(select, axis=1)]\
.apply(lambda x: x[['STNAME', 'CTYNAME']], axis=1)
只要编写了select
函数来选择行,这便是可以满足您需要的衬纸。