如何在Pandas DataFrame中添加条目?

时间:2018-10-23 00:37:28

标签: python pandas dataframe multivalue

基本上,我有从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

人口普查表图片

enter image description here

样品表:

   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

很抱歉,我对美国各州和县的了解不足,所以我只是将州名和县随机放在样本表中,只是为了向您展示我要从中得到什么。感谢您的高级帮助。

3 个答案:

答案 0 :(得分:1)

如果我正确阅读了代码中的逻辑,则要根据以下条件选择行:

  • REGION应该是12
  • 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中缺少一些列。但是,阅读循环我根本不需要循环。需要三个过滤器-REGIONPOPESTIMATE2015CTYNAME。如果我了解OP中的逻辑,那么在没有循环的情况下应该是可行的

选项1-原始答案

print df.loc[
            (df.REGION.isin([1,2])) & \
            (df.POPESTIMATE2015 > df.POPESTIMATE2014) & \
            (df.CTYNAME.str.startswith('Washington')), \
                          ['REGION', 'STNAME', 'CTYNAME']]

选项2-将andpd.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-将anddf.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函数来选择行,这便是可以满足您需要的衬纸。