看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
迭代工作可以将数据按行或者按列遍历,我们可以做更加细化、个性化的数据处理,不过大多数情况下,我们只要写好处理方法,用相应的函数帮我们去迭代。
注:本文所使用的df
和s
是数据信息一文中的数据。
df.iterrows()
可以按行取出数据,每条数据是一个元组:(索引, Series)
。其中 Series 的索引是 表头,可以用 s['team']
、 s.team
形式取出
for index, row in df.iterrows():
print(index, row['name'], row.team, row.Q1)
注: s['name']
和 s.name
输出的结果不一样,s.name
输出的是 Series 的 name 属性
df.itertuples()
可以生成一个 namedtuples 类型数据,非常方便使用:
for row in df.itertuples():
print(row)
# Pandas(Index=0, name='Liver', team='E', Q1=89, Q2=21, Q3=24, Q4=64)
for row in df.itertuples(index=False):
print(row)
# Pandas(name='Liver', team='E', Q1=89, Q2=21, Q3=24, Q4=64)
for row in df.itertuples(index=False, name='Gairuo'): # namedtuples
print(row)
# Gairuo(name='Liver', team='E', Q1=89, Q2=21, Q3=24, Q4=64)
# 使用
for row in df.itertuples():
print(row.Index, row.Q1)
注:
df.items()
Iterate over (column name, Series) pairs,和df.iteritems()
有相同的功能。
for label, ser in df.loc[1].items():
print(label, ser)
'''
name Arry
team C
Q1 36
Q2 37
Q3 37
Q4 57
'''
其他:
# 依次取出每个列
for column in df:
print(df[column])
# 可对每个列的内容进行迭代
for column in df:
for i in df[column]:
print(i)
# 当然,可以迭代指定列
for i in df.name:
print(i)
# 一个方法,只迭代想要的列
l = ['name', 'Q1']
cols = df.columns.intersection(l)
for col in cols:
print (col)
此外,df.Q1.values
和 df.values
可以返回 array
类型的数据,可用于迭代。
Series 具体的迭代方法有:
s = df.name.head()
s
'''
0 Liver
1 Arry
2 Ack
3 Eorge
4 Oah
Name: name, dtype: object
'''
# 直接迭代值
for i in s:
print(i)
'''
Liver
Arry
Ack
Eorge
Oah
'''
# 按(索引, 值)元组进行迭代
for i in s.items():
print(i)
'''
(0, 'Liver')
(1, 'Arry')
(2, 'Ack')
(3, 'Eorge')
(4, 'Oah')
'''
# 同上, 已经废除,1.5+ 版本不建议使用
for i in s.iteritems():
print(i)
另外,还可以用 s.to_dict()
将 Series 转为字典进行迭代。如:
for k,v in s.to_dict().items():
print(k, v)
用 s.values
和 s.to_numpy()
转为 array 类型进行值的迭代。
以下是一个生成 SQL union all 拼接的案例:
# 构造SQL行
sqls = (
df.astype(str).applymap(lambda x: "'"+x+"'")
.apply(lambda x: x.map(lambda y: f'{y} as {x.name}'))
.astype(str)
.apply(list, axis=1)
.apply(lambda x: ','.join(x))
)
# 生成 SQL, 实现最后一行没 union all
for k,v in sqls.to_dict().items():
print('select', v, end='\n')
print('union all', end='\n') if k < sqls.index.max() else print()
apply
和 applymap
可以对方法进行迭代,可以查询教程函数应用章节查看更多函数应用。
更新时间:2024-08-01 21:08:16 标签:pandas 迭代