我有一个包含三列的数据框。每行需要根据特定行和列中的值进行复制和更改两次。但是,其他列中的值必须保持不变。
我设法制作了数据框,如下所示:
df = pd.DataFrame({'Value': list(range(3)), 'Value2': list(range(3)), 'Value3':['A','B','C']})
idx = df['Value'].index
# construct dataframe to append
df_extra1 = df.loc[idx].copy()
df_extra2 = df.loc[idx].copy()
df_extra3 = df.loc[idx].copy()
df_extra4 = df.loc[idx].copy()
# add 3 seconds
df_extra1['Value'] = df_extra1['Value'] + 0.1
df_extra2['Value'] = df_extra2['Value'] - 0.1
df_extra3['Value2'] = df_extra3['Value2'] + 0.1
df_extra4['Value2'] = df_extra4['Value2'] - 0.1
# append to original
res1 = df.append(df_extra1)
res2 = res1.append(df_extra2)
res3 = res2.append(df_extra3)
res4 = res3.append(df_extra4)
这是结果,应该是这样:
Value Value2 Value3
0 0.0 0.0 A
1 1.0 1.0 B
2 2.0 2.0 C
0 0.1 0.0 A
1 1.1 1.0 B
2 2.1 2.0 C
0 -0.1 0.0 A
1 0.9 1.0 B
2 1.9 2.0 C
0 0.0 0.1 A
1 1.0 1.1 B
2 2.0 2.1 C
0 0.0 -0.1 A
1 1.0 0.9 B
2 2.0 1.9 C
是否有办法加快速度或使其更加简洁?
答案 0 :(得分:1)
尚不清楚您要做什么,但是根据您提供的示例,可以通过迭代要更新的列的乘积和要应用的更新来简化此操作:
import pandas as pd
from itertools import product
df = pd.DataFrame({'Value': list(range(3)), 'Value2': list(range(3)), 'Value3':['A','B','C']})
to_alter = ['Value', 'Value2']
constants = [0.1, -0.1]
dfs = [df, ]
for col, const in product(to_alter, constants):
t = df.copy()
t[col] += const
dfs.append(t)
result = pd.concat(dfs)
通过追加,您将重复复制数据帧,这并不理想,尤其是因为您已经在开始时创建了副本。