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中使用列表更快。也可以使用字符串。