我试图在Dataframe中创建两个新列,这些列是通过使用行之间的值执行的计算得出的。在将感兴趣的列转换为列表之后,我会在其感兴趣的列上使用for循环。
假设以下数据框:
import pandas as pd
import numpy as np
np.random.seed(100)
my_df=pd.DataFrame(np.random.randint(10, size=(6,4)))
my_df.columns=['A', 'x', 'B','y']
my_df.index=[10,30,40,20,60,50]
此后是否存在“ pandas”方式导致我的代码输出?
xs=np.array(my_df['x'])
diffs=[np.nan]
for i,x in enumerate(xs):
if i>0:
diffs.append(xs[i]-xs[i-1])
my_df['diffs']=diffs
ys=np.array(my_df['y'])
ratios=[]
for j,y in enumerate(ys):
if j>0 and ys[j-1]>=1.5*ys[j]:
ratios.append(True)
else:
ratios.append(False)
my_df['ratios']=ratios
print(my_df)
Output[]:
A x B y diffs ratios
10 8 8 3 7 NaN False
30 7 0 4 2 -8.0 True
40 5 2 2 2 2.0 False
20 1 0 8 4 -2.0 False
60 0 9 6 2 9.0 True
50 4 1 5 3 -8.0 False
我知道iterrows
,但未成功。非常感谢您的投入。
此外,如果我需要将列'x'和'y'转换为二维数组,例如:[[8,7],[0,2],[2,2],[0,4],[9,2],[1,3]]
,可以给我一些numpy
的方向吗?
感谢advace:-)
答案 0 :(得分:2)
尝试这个:
>>> import pandas as pd
>>> import numpy as np
>>>
>>> np.random.seed(100)
>>> my_df=pd.DataFrame(np.random.randint(10, size=(6,4)))
>>> my_df.columns=['A', 'x', 'B','y']
>>> my_df.index=[10,30,40,20,60,50]
>>> my_df["diffs"]=my_df["x"]-my_df["x"].shift(1)
>>> my_df
A x B y diffs
10 8 8 3 7 NaN
30 7 0 4 2 -8.0
40 5 2 2 2 2.0
20 1 0 8 4 -2.0
60 0 9 6 2 9.0
50 4 1 5 3 -8.0
>>> my_df["ratios"]=my_df["y"].shift(1)>=1.5 * my_df["y"]
>>> my_df
A x B y diffs ratios
10 8 8 3 7 NaN False
30 7 0 4 2 -8.0 True
40 5 2 2 2 2.0 False
20 1 0 8 4 -2.0 False
60 0 9 6 2 9.0 True
50 4 1 5 3 -8.0 False
>>>
并将x
和y
导出到2列列表:
>>> import numpy as np
>>> np.array(my_df[["x", "y"]])
array([[8, 7],
[0, 2],
[2, 2],
[0, 4],
[9, 2],
[1, 3]])
答案 1 :(得分:1)
所以我们可以做id col2(first day of every month) col4
1 1/1/2019 NULL
1 2/1/2019 red
1 3/1/2019 green
1 4/1/2019 blue
2 1/1/2019 NULL
2 2/1/2019 green
2 3/1/2019 green
2 4/1/2019 blue
3 1/1/2019 red
3 2/1/2019 red
3 3/1/2019 green
3 4/1/2019 green
zip