Бих искал да добавя две нови колони към моята рамка с данни, като прилагам функция, която взема входове от множество, специфични предварително съществуващи колони.
Ето моя подход, който работи за връщане на една колона, но не и на няколко:
Ето моята DataFrame:
d = {"a": [3,0,2,2],
"b": [0,1,2,3],
"c": [1,1,2,3],
"d": [2,2,1,3]}
df = pd.DataFrame(d)
Опитвам се да приложим тази функция:
def myfunc(a,b,c):
if a > 2 and b > 2:
print("condition 1",a,b)
return pd.Series((a,b))
elif a < 2 and c < 2:
print("condition 2",a,c)
return pd.Series((b,c))
else:
print("no condition")
return pd.Series((None,None))
Като този:
df["e"],df["f"] = df.apply(lambda x: myfunc(x["a"],x["b"],x["c"]),axis=1)
изход:
no condition
no condition
condition 2 0 1
no condition
no condition
Резултат от DataFrame:
Как мога да въведа няколко колони и да получа няколко колони?
Отговори:
2 за отговор № 1Въпросът е в задачата, а не myfunc
Когато се опитате да разопаковате кадър от данни като кортеж, той връща етикетите на колоните. Ето защо получавате (0, 1) за всичко
df["e"], df["f"] = pd.DataFrame([[8, 9]] * 1000000, columns=["Told", "You"])
print(df)
a b c d e f
0 3 0 1 2 Told You
1 0 1 1 2 Told You
2 2 2 2 1 Told You
3 2 3 3 3 Told You
употреба join
df.join(df.apply(lambda x: myfunc(x["a"],x["b"],x["c"]),axis=1))
Или pd.concat
pd.concat([df, df.apply(lambda x: myfunc(x["a"],x["b"],x["c"]),axis=1)], axis=1)
и двете дават
a b c d e f
0 3 0 1 2 NaN NaN
1 0 1 1 2 1.0 1.0
2 2 2 2 1 NaN NaN
3 2 3 3 3 NaN NaN
2 за отговор № 2
Вашата функция ще се върне един серия с тях NAs
или с 2-кортеж, когато my_funct съвпада.
Един от начините да го поправите е да върнете Серията вместо това, което ще бъде автоматично разширено чрез:
def myfunc(col1,col2,col3):
if col1 == "x" and col2 == "y":
return pd.Series((col1,col2))
if col2 == "a" and col3 == "b":
return pd.Series(("yes","no"))
Забележете двойните скоби, за да преминете един аргумент като кортеж. Списъкът също ще е наред.