Pandas新手和新的stackoverflow(真的),任何建议都非常感谢!
我有这个数据框df:
col1 col2 col3
Date
2017-08-24 100 101 105
2017-08-23 102 102 107
2017-08-22 101 100 106
2017-08-21 103 99 106
2017-08-18 103 98 108
...
现在,我想对每列的值进行一些计算,例如:计算每个值的对数。
我认为循环列并使用生成的列创建新的临时数据框是一个好主意。 这个新数据框应如下所示:
col1 RN LOG
Date
2017-08-24 100 1 2
2017-08-23 102 2 2,008600
2017-08-22 101 3 2,004321
2017-08-21 103 4 2,012837
2017-08-18 103 5 2,012837
所以我尝试了这个for循环:
for column in df:
tmp_df = df[column]
tmp_df['RN'] = range(1, len(tmp_df) + 1) # to create a new column with the row number
tmp_df['LOG'] = np.log(df[column]) # to create a new column with the LOG
但是,这并不会在col1旁边打印新列,而是在另一个下面打印新列。结果如下:
Name: col1, Length: 86, dtype: object
Date
2017-08-24 00:00:00 100
2017-08-23 00:00:00 102
2017-08-22 00:00:00 101
2017-08-21 00:00:00 103
2017-08-18 00:00:00 103
RN,"range(1, 86)"
LOG,"Date
2017-08-24 2
2017-08-23 2,008600
2017-08-22 2,004321
2017-08-21 2,012837
2017-08-18 2,012837
00:00:00被添加到第一部分的日期...
我也尝试过分配:
tmp_df = tmp_df.assign(LN=np.log(df[column]))
但这会导致"属性错误:"'系列'对象没有属性'分配'""
如果有人能指出我正确的方向,那真的很棒。 谢谢!答案 0 :(得分:1)
你的for循环是一个好主意,但你需要以这种方式在新列中创建pandas系列:
for column in df:
df['RN ' + column] = pd.Series(range(1, len(df[column]) + 1))
df['Log ' + column] = pd.Series(np.log(df[column]))
答案 1 :(得分:0)
现在我明白了。 :)
import pandas as pd
import numpy as np
...
for column in df:
tmp_res=pd.DataFrame(data=df[column])
newcol=range(1, len(df) + 1)
tmp_res=tmp_res.assign(RN=newcol)
newcol2=np.log(df[column])
tmp_res=tmp_res.assign(LN=newcol2)
这会打印彼此相邻的所有列:
col1 RN LOG
Date
2017-08-24 100 1 2
2017-08-23 102 2 2.008600
2017-08-22 101 3 2.004321
2017-08-21 103 4 2.012837
2017-08-18 103 5 2.012837
现在我可以继续处理它们或将它们全部放在csv / excel文件中。 谢谢你的所有建议!