gpt4 book ai didi

python - Pandas 将变量添加为列并对应于原始表(但它们的长度不同)

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:18 25 4
gpt4 key购买 nike

我问的有点复杂,就像标题一样。我编造了这个例子来向您展示我的问题。这是示例表:

df = pd.DataFrame({'Number': [1,2,3,4,5,6,7,8,9], 'Col1':['a','b','c','d','e','f','g','h','i']})

下一步是提取 df['Number'] 并出于某种原因运行迭代。 number= [i*i for i in df['Number']] 输出为 [1, 4, 9, 16, 25, 36, 49, 64, 81]

现在我有一个变量“number”,它是一个列表。

现在关键的一步是我必须重新组合这个列表。假设数字小于 40

number1 = [i for i in number if i < 40]
number2 = [i for i in number if i > 40]

OK,我想要的关键步骤是将number1和number2添加到df中,但是预期的最终输出是这样的:

即新增一列'Type',这两个新变量必须匹配索引,内容为'number1'和'number2',但不是'1,4,9...81'。

最佳答案

我想你需要numpy.where使用 bool 掩码:

print (df.Number.pow(2) < 40)
0 True
1 True
2 True
3 True
4 True
5 True
6 False
7 False
8 False
Name: Number, dtype: bool

df['Type'] = np.where(df.Number.pow(2) < 40, 'number1', 'number2')
#same as
#df['Type'] = np.where(df.Number ** 2 < 40, 'number1', 'number2')
#another solution
#df['Type'] = np.where(df.Number.pow(2).lt(40), 'number1', 'number2')
print (df)
Col1 Number Type
0 a 1 number1
1 b 2 number1
2 c 3 number1
3 d 4 number1
4 e 5 number1
5 f 6 number1
6 g 7 number2
7 h 8 number2
8 i 9 number2

时间 - numpy.where 最快:

df = pd.DataFrame({'Number': [1,2,3,4,5,6,7,8,9], 'Col1':['a','b','c','d','e','f','g','h','i']})
#[9000 rows x 5 columns]
df = pd.concat([df]*1000).reset_index(drop=True)

df['Type'] = np.where(df.Number.pow(2).lt(40), 'number1', 'number2')

df['Type1'] = 'number' + (1 + ((df.Number**2)>40).astype(int)).astype(str)

# Rule to produce new values
def f(row):
if row['Number']**2 > 40:
val = 'Number2'
else:
val = 'Number1'
return val

df['Type2'] = df.apply(f, axis=1)

#print (df)

In [218]: %timeit df['Type'] = np.where(df.Number.pow(2).lt(40), 'number1', 'number2')
1000 loops, best of 3: 1.63 ms per loop

In [219]: %timeit df['Type1'] = 'number' + (1 + ((df.Number**2)>40).astype(int)).astype(str)
100 loops, best of 3: 13.5 ms per loop

In [220]: %timeit df['Type2'] = df.apply(f, axis=1)
10 loops, best of 3: 127 ms per loop

编辑:

我创建了辅助列以更好地理解比较:

df['pow'] = df.Number.pow(2)
df['comaping val'] = 40
df['val'] = df.Number.pow(2).lt(40)
print (df)
Col1 Number pow comaping val val
0 a 1 1 40 True
1 b 2 4 40 True
2 c 3 9 40 True
3 d 4 16 40 True
4 e 5 25 40 True
5 f 6 36 40 True
6 g 7 49 40 False
7 h 8 64 40 False
8 i 9 81 40 False

关于python - Pandas 将变量添加为列并对应于原始表(但它们的长度不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com