/ / Използвайте функция за връщане на няколко изхода на колона от специфични входове на колони, като използвате Pandas - python, pandas

Използвайте функция, за да върнете няколко изхода на колони от конкретни входни колони, като използвате Pandas - python, pandas, прилагате

Бих искал да добавя две нови колони към моята рамка с данни, като прилагам функция, която взема входове от множество, специфични предварително съществуващи колони.

Ето моя подход, който работи за връщане на една колона, но не и на няколко:

Ето моята 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"))

Забележете двойните скоби, за да преминете един аргумент като кортеж. Списъкът също ще е наред.