我有:
df = pd.DataFrame([[1, 2,3], [2, 4,6],[3, 6,9]], columns=['A', 'B','C'])
,我需要计算每一行和每一列的i+1
和i
值之间的差,然后将其再次存储在同一列中。所需的输出将是:
Out[2]:
A B C
0 1 2 3
1 1 2 3
2 1 2 3
我尝试这样做,但是最终我得到了一个附加所有值的列表,我需要将它们分别存储(在列表中或在同一数据帧中)。
有办法吗?
difs=[]
for column in df:
for i in range(len(df)-1):
a = df[column]
b = a[i+1]-a[i]
difs.append(b)
for x in difs:
for column in df:
df[column]=x
答案 0 :(得分:1)
您可以使用熊猫函数shift
来实现您的预期目标。这就是它的作用(有关docs的更多信息):
按期望的周期数移动索引,并带有可选的时间频率。
for col in df:
df[col] = df[col] - df[col].shift(1).fillna(0)
df
Out[1]:
A B C
0 1.0 2.0 3.0
1 1.0 2.0 3.0
2 1.0 2.0 3.0
已添加
如果您想使用循环,则可能最好的方法是使用iterrows
(在here上有更多介绍),因为它提供了(index, Series)
对。
difs = []
for i, row in df.iterrows():
if i == 0:
x = row.values.tolist() ## so we preserve the first row
else:
x = (row.values - df.loc[i-1, df.columns]).values.tolist()
difs.append(x)
difs
Out[1]:
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
## Create new / replace old dataframe
cols = [col for col in df.columns]
new_df = pd.DataFrame(difs, columns=cols)
new_df
Out[2]:
A B C
0 1.0 2.0 3.0
1 1.0 2.0 3.0
2 1.0 2.0 3.0