Python pandas 遍历数据框
Posted
技术标签:
【中文标题】Python pandas 遍历数据框【英文标题】:Python pandas iterate through dataframe 【发布时间】:2015-07-23 00:25:24 【问题描述】:我正在尝试使用 Pandas,我需要解决以下问题。
我有一个数据集,其中的列如下所示:
X1 Y1 Z1 1.....(bunch of other columns)
X1 Y1 Z1 2.....(bunch of other columns)
X1 Y1 Z1 3.....(bunch of other columns)
X2 Y2 Z2 1.....(bunch of other columns)
X2 Y2 Z2 2.....(bunch of other columns)
X2 Y2 Z2 3.....(bunch of other columns)
X2 Y2 Z2 4.....(bunch of other columns)
我需要通过将前三列作为键来处理数据集。所以我需要首先考虑与X1 Y1 Z1
关联的所有行,在其中处理一堆列,然后转到下一个块X2 Y2 Z2
。所以首先它的
X1 Y1 Z1 1.....(bunch of other columns)
X1 Y1 Z1 2.....(bunch of other columns)
X1 Y1 Z1 3.....(bunch of other columns)
紧随其后
X2 Y2 Z2 1.....(bunch of other columns)
X2 Y2 Z2 2.....(bunch of other columns)
X2 Y2 Z2 3.....(bunch of other columns)
X2 Y2 Z2 4.....(bunch of other columns)
我正在寻找 pandas 或 numpy 中的解决方案来处理此数据集。而且我处理数百万行,所以 pandas 的 iterrows()
会很慢。
【问题讨论】:
【参考方案1】:如果您的数据被加载到带有列X
、Y
、Z
、col1
、col2
.... 的 DataFrame df
中,那么您可以循环“组”/数据的“块”如下:
for concat_XYZ, df_group in df.groupby(df['X']+df['Y']+df['Z']):
# process df_group
# ....
每个df_group
都是一个块(或本身就是一个DataFrame),正如您在问题中所希望的那样。 X
、Y
和 Z
列中的字符串连接用于唯一标识一个组。
【讨论】:
df_group
包含看起来混乱的原始数据框
df_group
将是 2 个元素的元组。第一个元素是X
、Y
和Z
列的串联字符串。第二个元素是您希望处理的子组/块。编辑答案以分隔for
行中的两个元素。
concat_XYZ
现在是类似X1Y2Z2
的字符串,而df_group
现在是您处理的DataFrame/chunk。
这就是我所做的,到目前为止它似乎工作正常..def func1(): df_grouped = df.groupby(df['X'] + df['Y'] + str(df['Z'])) for d in df_grouped: list_of_items = d[1]['col4'].get_values().tolist() processList(list_of_items) def processList(self, list_of_items): # process the list_of_items
【参考方案2】:
如果您的处理是相同的,但您需要按组将它们分开,然后编写您的函数并使用groupby.apply()
,它将在明智地应用您的函数组后返回数据帧。
def do_stuff(DataFrame):
DataFrame['stuff'] = DataFrame['col1'] + DataFrame['col2'] + DataFrame['col3']
return DataFrame
new_df = original_df.groupby(['col1', 'col2', 'col3'], as_index=False).apply(do_stuff)
【讨论】:
以上是关于Python pandas 遍历数据框的主要内容,如果未能解决你的问题,请参考以下文章
Python 3 函数循环遍历 pandas 数据框以更改模式