在特定日期循环 Dataframe Pandas Python
Posted
技术标签:
【中文标题】在特定日期循环 Dataframe Pandas Python【英文标题】:Loop Dataframe Pandas Python on specific dates 【发布时间】:2018-07-09 21:30:55 【问题描述】:我正在尝试遍历数据框并获得此处描述的解决方案 Old Post。不知何故,我正在寻找更具体的东西,我刚刚意识到。循环应该计算结果并将每个日期的输出写入 csv 文件,其中 csv 文件包含日期作为文件名,文件中应该是日期和结果。我更喜欢使用循环并扩展代码。
import pandas as pd
def calc_funct(x):
func = x^2
return func
def calc_funct2(y):
func = y^3
return func
if __name__ == '__main__':
df = pd.read_csv('C:/Data.csv')
for index, row in df.iterrows():
result = []
result = (calc_funct(row['x']))
print(result)
输入如下所示:
date x y z
0 2017-11-11 18 17 7
1 2017-11-11 16 19 3
2 2017-11-11 13 14 2
3 2017-11-11 12 13 1
4 2017-11-11 11 12 9
5 2017-11-11 10 11 10
6 2017-11-11 21 10 11
7 2017-11-12 13 19 12
8 2017-11-13 18 17 12
9 2017-11-14 9 10 20
10 2017-11-15 2 20 13
11 2017-11-18 13 13 9
12 2017-11-19 18 14 16
13 2017-11-20 14 11 19
14 2017-11-21 18 15 19
为了使它更容易理解,我包含了一个手工制作的示例,我想让它更加自动化,因为我在数据框中获取所有数据,并且只是从中获取正确的数据,这取决于日期并扩展它让它更清楚。也许我的解释太糟糕了,并试图找出一种更容易理解的方式:
for loop date 1 (2017-11-11):
result = []
for loop through values for the dedictaed date (Note every result is an own object at the end):
result = OwnObject(calc_funct(x),calc_funct2(y/100))
store results in a csv file with the date given (2017-11-11)
Loop date 2 (2017-11-12):
result = OwnObject(calc_funct(x),calc_funct2(y/100))
store results in a csv file with the date given (2017-11-12)
等等等等……
OwnObject 暂时没那么重要
【问题讨论】:
“我更喜欢使用循环并只是扩展代码。”为什么?如果您首先使用 pandas,您是否不喜欢矢量化方法(球场,快 100 倍)并在之后使用to_csv
?
@roganjosh,为什么我更喜欢循环是因为我有更多的功能可以提供,并且只是根据日期从我的数据框中获取提取物。速度不是问题
【参考方案1】:
您可以在 for 循环结束时write csv:
store_result =
for index, row in df.iterrows():
result = []
result = (calc_funct(row['x'], row['y'], row['z']))
store_result[date] = result
with open(row["date"] + '.csv', 'wb') as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerow(row["date"] + "," + str(result))
【讨论】:
@Thomas,是的,这与我所期待的很接近。如果我不将其存储到 csv 文件中而只是将其用于进一步计算然后存储它会怎样。我只是想确保我真的只是在循环日期。抱歉,如果解释得太复杂了 @MCM 不确定是否理解您的请求。如果您想跟踪结果,您绝对应该使用 pandas。 @MCM 用result = (calc_funct(row['x'], row['y'], row['z']))
中的result
做任何你想做的事,然后将结果替换为row["date"] + "," + str(result)
而不是result
@roganjosh,你能在 Thomas 的结果中显示并在其中编辑吗?
@MCM 我不会因为这样的事情而编辑这篇文章。你已经在你的问题中展示了大量的 python 知识来处理这个问题;例如result2 = result * 2
然后csv_writer.writerow(row["date"] + "," + str(result2))
。 IMO 这篇文章按原样回答了您的问题。【参考方案2】:
我强烈推荐使用熊猫的方式。那你为什么要使用熊猫呢?轻松读取和保存 csv?
也许这会激励你。
这就是你约会的样子。
df = pd.DataFrame([
['2017-11-11', 18, 17, 7],
['2017-11-11', 16, 19, 3],
['2017-11-12', 10, 4, 5],
['2017-11-11', 1, 2, 3],
], columns=['date', 'x', 'y', 'z'])
首先,您需要确保您的值格式正确。
df.date = pd.to_datetime(df.date)
df.x = pd.to_numeric(df.x)
df.y = pd.to_numeric(df.y)
df.z = pd.to_numeric(df.z)
print(df.date.dtype) # datetime64[ns]
如果您不想在原地应用更改,您可以在新列中轻松完成。
df = df.assign(x2=df.x.apply(calc_funct))
df = df.assign(y2=df.y.apply(calc_funct2))
df
date x y z x2 y2
0 2017-11-11 18 17 7 16 18
1 2017-11-11 16 19 3 18 16
2 2017-11-12 10 4 5 8 7
3 2017-11-11 1 2 3 3 1
之后,您可以进行分组、聚合,您可以将计算应用于特定日期的一组结果。
使用这种方法,您可以进行任意数量的计算,这是对绩效和教育的真正投资。
更新
您也可以将对象添加到数据框中。
class OwnObject(object):
def __init__(self, x2, y2=None):
self._x2 = x2
self._y2 = y2
def __repr__(self):
# Just for representation reason
return 'OwnObject(, )'.format((self._x2), (self._y2))
def create_object(row):
return OwnObject(row.x2, row.y2)
df = df.assign(my_object = df.apply(create_object, axis=1))
df
date x y z x2 y2 my_object
0 2017-11-11 18 17 7 16 18 OwnObject(16, 18)
1 2017-11-11 16 19 3 18 16 OwnObject(18, 16)
2 2017-11-12 10 4 5 8 7 OwnObject(8, 7)
3 2017-11-11 1 2 3 3 1 OwnObject(3, 1)
如果要获取所有已创建对象的列表:
list(df.my_object)
# outputs: [OwnObject(16, 18), OwnObject(18, 16), OwnObject(8, 7), OwnObject(3, 1)]
【讨论】:
非常感谢这个例子。我试图让上面的东西更清楚。熊猫也可以这样做吗?我最后不想将它存储在数据框中 我没看清楚你,你是说聚合? OwnObject 只是一个对象,稍后也会存储并用于我在示例中未提及的另一个计算。我认为一般逻辑应该很清楚吧? 非常感谢,你拯救了我的一天!!!!!!!现在我明白你和你的 cmets 一起去哪里了。还有一个问题。如果我定义了一个需要填充两个变量的函数,我从我的数据框中的两个不同列中获取这将如何工作,例如def calc3(x,y) 是的,例如df = df.assign(xy=some_x_calc(df.x) + df.y/100)
或df = df.assign(xy2=lambda row: sum_x_and_y(row.x, row.y))
。如果您不想将新列分配给 df,您可以只写 df.x + df.y
。我建议你使用 jupyter notebook 和 pdb 调试器来玩,看看在特定的代码时刻有哪些操作可用。以上是关于在特定日期循环 Dataframe Pandas Python的主要内容,如果未能解决你的问题,请参考以下文章