如何在 Pandas DataFrame 中添加条目?

How to add entries in Pandas DataFrame?

基本上我有美国的人口普查数据,我从 csv 文件中读取 Pandas。 现在我必须编写一个函数,以特定方式从我从 csv 文件和 return 获得的 table 中找到县(不会解释,因为这不是问题所在)。

我的尝试:

我所做的是用列名创建列表(函数必须 return),然后使用 if 语句在 for 循环中应用特定条件以读取条目各自列表中的所有必需列。现在我创建了一个新的 DataFrame,我想将列表中的条目读入这个新的 DataFrame。我尝试了相同的 for 循环来完成它,但都是徒劳的,试图从这些列表中创建系列并尝试将它们作为参数传递到 DataFrame 中,仍然是徒劳的,从这些列表中创建 DataFrames 并尝试使用 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

人口普查TABLE 图片:

样本 TABLE:

   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

很抱歉对美国的州和县知之甚少,我只是随机将州名和县放在样本中table,只是为了告诉你我想知道什么那个。感谢先进的帮助。

如果我没看错您代码中的逻辑,您希望根据以下条件 select 行:

  • REGION 应该是 12
  • POPESTIMATE2015 > POPESTIMATE2014
  • CTYNAME 需要以 "Washington"
  • 开头

一般来说,Pandas 可以轻松地根据条件 select 行,而无需遍历数据帧:

df = census_df[
        ((df.REGION == 1) | (df.REGION == 2)) & \
        (df.POPESTIMATE2015 > POPESTIMATE2014) & \
        (df.CTYNAME.str.startswith('Washington'))
    ]

OP 中发布的源 DF 中缺少一些列。但是,阅读循环我认为根本不需要循环。需要 3 个过滤器 - 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']]

假设您要选择某种满足条件的行,我们只说 select(row) 和此函数 returns True 如果选择或 False 如果不是。我不会推断它是什么,因为你明确地说它不重要

然后您需要该行的 STNAME 和 CTYNAME。

所以这是你要做的:

your_new_df = census_df[census_df.apply(select, axis=1)]\
.apply(lambda x: x[['STNAME', 'CTYNAME']], axis=1)

如果您编写了 select 函数来选择行,这是一个可以满足您需求的衬垫。