【发布时间】:2020-03-08 20:14:03
【问题描述】:
在谈到 Pandas 对象列表及其循环时,我遇到了一个小麻烦。在我正在处理的一些代码中,有一些 pandas 数据帧被放置在一个列表中,因此可以对所有这些数据帧执行操作。
但是,我注意到某些操作,例如创建新列,在“幼稚”的 Python for loops 中工作,而其他操作,例如反转数据帧的顺序,
- 需要显式索引,并且
- 不影响原始数据帧(仅它们的副本位于 列表)。
我正在寻求帮助,以使我的 MWE 的第二部分像第一部分一样容易地工作,并且首先要深入了解导致这种差异的潜在逻辑。
## Creating data
import pandas as pd
from io import StringIO
data = StringIO(
"""
date;time;random
2019-06-12;19:59:59+00:00;99
2019-06-12;19:59:54+00:00;200
2019-06-12;19:59:52+00:00;65
2019-06-12;19:59:34+00:00;140
"""
)
df = pd.read_csv(data, sep=";")
print(df)
## Creating list; there is only one dataframe in this list to make the
## code easier to work with, but in actuality I am working with >20 dataframes
df_list = [df]
## First operation - successfully adds new column to both original df and df_list[0]
for dataframe in df_list:
dataframe['date_time'] = pd.to_datetime(dataframe['date']+' '+dataframe['time'], utc=True)
print(df)
print(df_list[0])
## Second operation - successful only if using explicit indexing over list, first commented segment does nothing;
## using second segment works, but does not effect original df, only df_list[0].
# for dataframe in df_list:
# dataframe = dataframe.iloc[::-1]
# dataframe.reset_index(drop=True, inplace=True)
for i in range(len(df_list)):
df_list[i] = df_list[i].iloc[::-1]
df_list[i].reset_index(drop=True, inplace=True)
print(df)
print(df_list[0])
【问题讨论】:
-
for in循环不能通过引用工作。使用enumerate,然后引用df_list[i]。 -
df_list有什么意义,你想在这里做什么?使用 Pandas 时最好尽可能避免显式循环,因此这会引发一些问题。第一个/原始 DataFrame 来自哪里? -
@AlexanderCécile,我认为使用列表的原因可能不仅仅是一个数据帧,而是一个数据帧列表。
-
@BillChen 这当然有可能,我只是被
df_list = [df]弄糊涂了。 -
@BillChen 啊,实际上你可能是对的,我只是注意到他在帖子中说列表中有多个 DataFrame。
标签: python pandas loops dataframe shallow-copy