Python 熊猫将变量添加为列并对应于原始表(但长度不同)
我问的问题有点复杂,比如标题。我做这个例子是为了向你们展示我的问题。以下是示例表:Python 熊猫将变量添加为列并对应于原始表(但长度不同),python,pandas,Python,Pandas,我问的问题有点复杂,比如标题。我做这个例子是为了向你们展示我的问题。以下是示例表: 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代表df['number']]输出是[1,4,9,16,25,36,49,64,81] 现在我有一个变量'number',它是一个列表
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代表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]
number1=[如果i<40,则i代表数字中的i]
number2=[如果i>40,则i代表数字中的i]
好的,我想要的关键步骤是将number1和number2添加到df中,但预期的最终输出如下所示:
也就是说,添加一个新列“Type”,这两个新变量必须与索引匹配,内容是“number1”和“number2”,而不是“1,4,9…81” 我认为您需要使用布尔掩码
:
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
编辑: 为了更好地理解比较,我创建了帮助器列:
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
制作自定义函数,然后在
pandas中使用它。应用
import pandas as pd
# Rule to produce new values
def f(row):
if row['Number']**2 > 40:
val = 'Number2'
else:
val = 'Number1'
return val
df = pd.DataFrame({'Number': [1,2,3,4,5,6,7,8,9], 'Col1':['a','b','c','d','e','f','g','h','i']})
# Apply the function to construct new column
df['Type'] = df.apply(f, axis=1)
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
以下是我的创造性方法:
数据:
In [23]: df
Out[23]:
Col1 Number
0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
6 g 7
7 h 8
8 i 9
In [24]: df['Type'] = 'number' + (1 + ((df.Number**2)>40).astype(int)).astype(str)
In [25]: df
Out[25]:
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
In [29]: ((df.Number**2)>40).astype(int)
Out[29]:
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 1
Name: Number, dtype: int32
In [30]: 1 + ((df.Number**2)>40).astype(int)
Out[30]:
0 1
1 1
2 1
3 1
4 1
5 1
6 2
7 2
8 2
Name: Number, dtype: int32
解决方案:
In [23]: df
Out[23]:
Col1 Number
0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
6 g 7
7 h 8
8 i 9
In [24]: df['Type'] = 'number' + (1 + ((df.Number**2)>40).astype(int)).astype(str)
In [25]: df
Out[25]:
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
In [29]: ((df.Number**2)>40).astype(int)
Out[29]:
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 1
Name: Number, dtype: int32
In [30]: 1 + ((df.Number**2)>40).astype(int)
Out[30]:
0 1
1 1
2 1
3 1
4 1
5 1
6 2
7 2
8 2
Name: Number, dtype: int32
结果:
In [23]: df
Out[23]:
Col1 Number
0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
6 g 7
7 h 8
8 i 9
In [24]: df['Type'] = 'number' + (1 + ((df.Number**2)>40).astype(int)).astype(str)
In [25]: df
Out[25]:
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
In [29]: ((df.Number**2)>40).astype(int)
Out[29]:
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 1
Name: Number, dtype: int32
In [30]: 1 + ((df.Number**2)>40).astype(int)
Out[30]:
0 1
1 1
2 1
3 1
4 1
5 1
6 2
7 2
8 2
Name: Number, dtype: int32
说明:
In [23]: df
Out[23]:
Col1 Number
0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
6 g 7
7 h 8
8 i 9
In [24]: df['Type'] = 'number' + (1 + ((df.Number**2)>40).astype(int)).astype(str)
In [25]: df
Out[25]:
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
In [29]: ((df.Number**2)>40).astype(int)
Out[29]:
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 1
8 1
Name: Number, dtype: int32
In [30]: 1 + ((df.Number**2)>40).astype(int)
Out[30]:
0 1
1 1
2 1
3 1
4 1
5 1
6 2
7 2
8 2
Name: Number, dtype: int32
我喜欢你对这个问题的回答。我还想问一下,当我提取'number=df['number']”并键入'number'时,它有两列,其中一列是索引。但是,对于'number=[i*i for i in df['number']],输出是'[1,4,9,16,25,36,49,64,81]'。索引在哪里?您可以创建列表,但在我的解决方案中,请与列
-系列
进行比较。我试着把它添加到我的答案中,我希望现在它更清楚。如果没有,请让我知道,我尝试解释更多。解决方案是将列pow
与comaping val
进行比较,输出是另一列(Series
)与True、
False`。嗨,我仍然想知道在某种情况下是否必须创建列表。有没有办法做同样的事情?(例如,为了处理字符串,你不能简单地应用数学函数)我认为在熊猫中使用序列更好,在更大的df中使用列表更快。也可以使用字符串。