鉴于此数据框
df=pd.DataFrame({"A":[0.380,0.475,0.380,0.475,0.570],"B":[20,20,63,63,63]})
A B
0 0.380 20
1 0.475 20
2 0.380 63
3 0.475 63
4 0.570 63
我想添加一个返回给定A列输入的函数结果的列,但该函数应根据B列的内容而变化。使用apply方法可以很容易地添加基于A的列:
def conv(x):
return (33.8*np.sin(1.65*(x-0.89))+33.9)/0.19
df['C']=df['A'].apply(conv)
df
但是我想根据B列中的条目对A应用完全不同的函数。在定义中设置任何'if'语句当然会返回ValueErrors,并使用df['C'].isin([20])
给我一个列表布尔值接下来我将尝试df.groupby('B')
并为每个组应用不同的功能,但我仍然想知道什么是最优雅的解决方案。
答案 0 :(得分:0)
我创建了第二个函数(conv2)并假设你想要计算转换,如果列B等于20,否则转换为conv2。我得到以下内容:
df = pd.DataFrame({"A": [0.380, 0.475, 0.380, 0.475, 0.570], "B": [20, 20, 63, 63, 63]})
def conv(x):
return (33.8*np.sin(1.65*(x-0.89))+33.9)/0.19
def conv2(x):
return 2.0 * x
df['C'] = df.apply(lambda x: conv(x.A) if (x.B == 20) else conv2(x.A), axis=1)
我得到以下数据框:
A B C
0 0.380 20 45.775003
1 0.475 20 65.906299
2 0.380 63 0.760000
3 0.475 63 0.950000
4 0.570 63 1.140000
这是你在找什么?
答案 1 :(得分:0)
还有另一种使用r'\d{2,3}-\d{9,11}'
的方法可以占用apply()
的多个列。以下是一个例子,所有大写字母都包含占位符:
DataFrame
注意我们如何将函数直接应用于def conv(x, y):
if y == SOME_VALUE_1:
return (33.8*np.sin(1.65*(x-0.89))+33.9)/0.19
else:
return SOME_OTHER_FUNCTION_OF_X
df['C']=df.apply(lambda x : conv(x['A'], x['B']) , axis=1)
df
,而不仅仅是它的一列。 DataFrame
选出正确的列并将它们发送给函数。 lambda
部分指示pandas按列应用函数(默认为行式)。
答案 2 :(得分:0)
你可以这样设置
ul, li {
display:inline;
margin-top: 300px;
line-height: 10px;
padding-left: 80px;
padding-top: 10px;
padding-bottom: 10px;
padding-right: 66px;
font-size: 18px;
width: 100%;
background-color: #216064;
}