以此为出发点:
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
one two three
0 10 1.2 4.2
1 15 70 0.03
2 8 5 0
我想在pandas中使用类似if
语句的内容。
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
基本上,通过if
语句检查每一行,创建新列。
文档说使用.all
但没有示例...
答案 0 :(得分:66)
您可以使用np.where。如果cond
是布尔数组,A
和B
是数组,那么
C = np.where(cond, A, B)
将C定义为A
,其中cond
为True,B
则cond
为False。
import numpy as np
import pandas as pd
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
, df['one'], np.nan)
产量
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 NaN
2 8 5 0 NaN
如果您有多个条件,则可以使用np.select代替。
例如,如果您希望在df['que']
时df['two']
等于df['one'] < df['two']
,那么
conditions = [
(df['one'] >= df['two']) & (df['one'] <= df['three']),
df['one'] < df['two']]
choices = [df['one'], df['two']]
df['que'] = np.select(conditions, choices, default=np.nan)
产量
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 70
2 8 5 0 NaN
如果我们在df['one'] >= df['two']
时可以假设df['one'] < df['two']
错,那么条件和选择可以简化为
conditions = [
df['one'] < df['two'],
df['one'] <= df['three']]
choices = [df['two'], df['one']]
(如果df['one']
或df['two']
包含NaN,则假设可能不正确。)
请注意
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
使用字符串值定义DataFrame。由于它们看起来是数字的,因此最好将这些字符串转换为浮点数:
df2 = df.astype(float)
这会改变结果,因为字符串逐字符比较,而浮点数则按数字比较。
In [61]: '10' <= '4.2'
Out[61]: True
In [62]: 10 <= 4.2
Out[62]: False
答案 1 :(得分:31)
您可以将.equals
用于列或整个数据框。
df['col1'].equals(df['col2'])
如果他们相等,该语句将返回True
,否则为False
。
答案 2 :(得分:19)
您可以使用apply()并执行类似的操作
df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)
或者如果您不想使用lambda
def que(x):
if x['one'] >= x['two'] and x['one'] <= x['three']:
return x['one']
else:
''
df['que'] = df.apply(que, axis=1)
答案 3 :(得分:8)
一种方法是使用布尔系列来索引列df['one']
。这会为您提供一个新列,其中True
条目与df['one']
相同的行具有相同的值,False
值为NaN
。
布尔系列仅由您的if
语句提供(尽管有必要使用&
代替and
):
>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 NaN
2 8 5 0 NaN
如果您希望NaN
值替换为其他值,则可以在新列fillna
上使用que
方法。我在这里使用了0
而不是空字符串:
>>> df['que'] = df['que'].fillna(0)
>>> df
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 0
2 8 5 0 0
答案 4 :(得分:4)
将每个条件包装在括号中,然后使用&
运算符组合条件:
df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']
您可以使用~
(&#34; not&#34;运算符)来填充不匹配的行以反转匹配:
df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''
您需要使用&
和~
而不是and
和not
,因为&
和~
运算符可以逐个使用元件。
最终结果:
df
Out[8]:
one two three que
0 10 1.2 4.2 10
1 15 70 0.03
2 8 5 0
答案 5 :(得分:1)
如果要从数据框中检查多个条件并在其他列中输出特定选择,请使用np.select
conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]
df["new column"]=np.select=(condtion,choice,default=)
注意:没有条件,没有选择项应该匹配,如果对于两个不同的条件您有相同的选择,请重复选择文本
答案 6 :(得分:0)
我认为最接近OP直觉的是内联if语句:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))
答案 7 :(得分:0)
使用lambda表达式:
df[df.apply(lambda x: x['col1'] != x['col2'], axis = 1)]