如何在 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
应该是 1
或 2
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 个过滤器 - 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']]
假设您要选择某种满足条件的行,我们只说 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
函数来选择行,这是一个可以满足您需求的衬垫。
基本上我有美国的人口普查数据,我从 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
应该是1
或2
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 个过滤器 - 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']]
假设您要选择某种满足条件的行,我们只说 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
函数来选择行,这是一个可以满足您需求的衬垫。