我想在数据框中添加两列,假设我们在数据框中有50行,因此我的第1列值应为1到50,第2列值应为51到100。
def insertId(new_df, str):
df.insertId(0, str, range(1, 1 + len(df)))
return df
上述功能需要更正以满足我的要求,但无法这样做,因为我是Python的初学者。
答案 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