我想在数据框中添加两列增量值

时间:2017-11-17 07:09:15

标签: python dataframe

我想在数据框中添加两列,假设我们在数据框中有50行,因此我的第1列值应为1到50,第2列值应为51到100。

def insertId(new_df, str):
    df.insertId(0, str, range(1, 1 + len(df)))
    return df

上述功能需要更正以满足我的要求,但无法这样做,因为我是Python的初学者。

3 个答案:

答案 0 :(得分:1)

# Create sample data for initial dataframe.
np.random.seed(0)
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
>>> df
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
2  0.950088 -0.151357 -0.103219
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

# Add new columns in sequential order.
n = len(df)
new_cols = ['a', 'b']  # Desired names for new columns.
new_col_count = len(new_cols)
df2 = pd.DataFrame(
    np.arange(1, n * new_col_count + 1).reshape(n, new_col_count, order='F')
    columns=new_cols, 
    index=df.index)
>>> pd.concat([df, df2], axis=1)
          A         B         C  a   b
0  1.764052  0.400157  0.978738  1   6
1  2.240893  1.867558 -0.977278  2   7
2  0.950088 -0.151357 -0.103219  3   8
3  0.410599  0.144044  1.454274  4   9
4  0.761038  0.121675  0.443863  5  10

答案 1 :(得分:0)

首先创建numpy array并将其传递给DataFrame构造函数:

a = np.arange(1, 101).reshape(2,-1).T
df1 = pd.DataFrame(a, columns=['a','b'])

print(df1.head())

   a   b
0  1  51
1  2  52
2  3  53
3  4  54
4  5  55

最后将其添加到原始DataFrame:

df = df.join(df1)

使用insert功能解决问题 - 可以指定列pos的位置,然后指定列名col和最后一个起始编号start

#some Dataframe
a = np.arange(1, 101).reshape(2,-1).T
df = pd.DataFrame(a, columns=['a','b'])
print (df.head())
   a   b
0  1  51
1  2  52
2  3  53
3  4  54
4  5  55

def insertId(new_df, pos, col, start):
    new_df.insert(pos, col, range(start, len(new_df) + start))
    return new_df

#insert new column called s to DataFrame df in position 0 and values starts in 50
df = insertId(df, 0, 's', 50)
df = insertId(df, 2, 'new', 14)
print (df.head())

    s  a  new   b
0  50  1   14  51
1  51  2   15  52
2  52  3   16  53
3  53  4   17  54
4  54  5   18  55

答案 2 :(得分:0)

我将利用@ Alexander的设置

设置

np.random.seed(0)
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
df
          A         B         C
0  1.764052  0.400157  0.978738
1  2.240893  1.867558 -0.977278
2  0.950088 -0.151357 -0.103219
3  0.410599  0.144044  1.454274
4  0.761038  0.121675  0.443863

选项1
我们可以通过Numpy执行外部添加来生成另一个通用解决方案。在下面的示例中,我将使用m = 5指定的另外5个列显示示例。我使用string的{​​{1}}来获取额外列的标签。

ascii_lowercase

选项2
我倾向于使用from string import ascii_lowercase as labels import pandas as pd impot numpy as np n = len(df) m = 5 df.assign(**dict(zip( labels[:m], np.add.outer(np.arange(m) * n, np.arange(n)) ))) A B C a b c d e 0 1.764052 0.400157 0.978738 0 5 10 15 20 1 2.240893 1.867558 -0.977278 1 6 11 16 21 2 0.950088 -0.151357 -0.103219 2 7 12 17 22 3 0.410599 0.144044 1.454274 3 8 13 18 23 4 0.761038 0.121675 0.443863 4 9 14 19 24 显示解决方案。但我们可以用pd.DataFrame.assign完成同样的事情,可能更清晰。在这种情况下,我仍在使用Numpy的外部添加,但我正在使用我在选项1中所做的转置并构建一个新的数据帧并将其与原始数据帧连接。

pd.DataFrame.join