使用迭代修改多列数据,但更改每列的增量值

时间:2019-04-22 12:44:16

标签: python-3.x pandas

我正在尝试修改pandas中的多个列值。每一列中的数据帧具有不同的增量,以便在折线图上绘制时每一列的值不会相互重叠。

这是我想做的最终目标:link

假设我有这种数据框:

Col1 Col2 Col3
0    0.3  0.2
1    1.1  1.2
2    2.2  2.4
3    3    3.1

但具有数百列和数千个值。

在excel或matplotlib上的线图上绘制此图形时,值彼此重叠,因此我想通过为每一列添加相同的值来分隔每一列,如下所示:

Col1(+0) Col2(+10)  Col3(+20)
0        10.3       20.2
1        11.1       21.2
2        12.2       22.4
3        13         23.1

通过将相同的值添加到一列并以每列增加10的增量,我可以看到每一行而不会在一张图中重叠。

我曾考虑过使用循环和迭代来自动执行此增值过程,但是我在Stackoverflow上找不到任何以前的解决方案,该解决方案解决了如何更改增量值的问题(例如,在一个循环中在Col1中添加0,然后在下一个循环中将10加到Col2)在不同的列之间,但不在列的值之内。更糟糕的是,我是一个初学者,对编程或数据操作一无所知。

由于数据为CSV格式,因此我首先使用Pandas读取数据并将其存储在Dataframe中,然后选择要编辑的列:

import pandas as pd

#import CSV file
df = pd.read_csv ('data.csv')

#store csv data into dataframe
df1 = pd.DataFrame (data = df)

# Locate columns that I want to edit with df.loc
columns = df1.loc[:, ' C000':]

这是我被困的地方:

# use iteration with increments to add numbers
n = 0
for values in columns:
    values = n + 0
    print (values)

但是此for循环仅添加一个增量值(在本例中为0),并将其添加到所有列,而不仅是第一列。不仅如此,我也不知道如何为下一列添加下一个增量值。

任何可能的解决方案将不胜感激。

2 个答案:

答案 0 :(得分:1)

IIUC,只需在axis=1上使用df.add(),并使用df.columns长度的列表:

df1 = df.add(list(range(0,len(df.columns)*10))[::10],axis=1)

或者像@jezrael建议的那样,更好:

df1=df.add(range(0,len(df.columns)*10, 10),axis=1)
print(df1)

   Col1  Col2  Col3
0     0  10.3  20.2
1     1  11.1  21.2
2     2  12.2  22.4
3     3  13.0  23.1

详细信息

list(range(0,len(df.columns)*10))[::10]
#[0, 10, 20]

答案 1 :(得分:0)

我建议您避免循环遍历数据帧,因为它效率低下,而是考虑添加到矩阵中。

例如

import numpy as np 
import pandas as pd 


# Create your example df 
df = pd.DataFrame(data=np.random.randn(10,3))

# Create a Matrix of ones
x = np.ones(df.shape)
# Multiply each column with an incremented value * 10
x =  x * 10*np.arange(1,df.shape[1]+1)

# Add the matrix to the data
df + x 

编辑:如果您不想以10,20,30递增,而以0,10,20递增,请使用

import numpy as np 
import pandas as pd 


# Create your example df 
df = pd.DataFrame(data=np.random.randn(10,3))

# Create a Matrix of ones
x = np.ones(df.shape)

# THIS LINE CHANGED 
# Obmit the 1 so there is only an end value -> default start is 0 
# Adjust the length of the vector 
x =  x * 10*np.arange(df.shape[1])

# Add the matrix to the data
df + x