![](/img/trans.png)
[英]Create a new column in pandas based on values in multiple columns and the same condition
[英]How can I iterate over column values in Pandas and create a new observation based on the values of multiple columns in the same row?
因此,发布了这个问题的许多变体,但它们都不是我正在寻找的。
我有一个数据集,其中包含多个包含 boolean 值的列,这些值指示用户是否在其居住地列出了城市名称。 用户可以命名多个城市名称。 见下文。
+----+----------+-------+-------------+------------------------------------+
| ID | New York | LA | New Orleans | New Var |
+----+----------+-------+-------------+------------------------------------+
| 1 | True | False | True | 'New York, NY', 'New Orleans, LA' |
| 2 | True | False | False | 'New York, NY |
| 3 | False | False | False | 'None' |
+----+----------+-------+-------------+------------------------------------+
我要做的是创建一个新列,用于存储用户列出的所有城市名称的文本名称。 我可以用一百万个嵌套的 if 条件来做到这一点,但我确信在 Pandas 中有更好的方法来做到这一点。 谁能指出我正确的方向?
您可以将布尔值乘以字符串,并且由于 pandas 的 sum() function 连接字符串,您可以获取数据和列值的点积。 两者都做,你可以这样做:
df = pd.DataFrame({'NY':[True, True, False],'SF':[True, False, True]})
delimiter = ", "
tmp= df.rename(columns=lambda x: x+delimiter)
df['Cities'] = tmp.dot(tmp.columns).str[:-len(delimiter)]
df
#~ NY SF Cities
#~ 0 True True NY, SF
#~ 1 True False NY
#~ 2 False True SF
如果只有一些列是城市名称,您可以列出城市列并使用这些列:
cities = ['NY','SF']
tmp= df[cities].rename(columns=lambda x: x+delimiter)
IIUC,如果您的值确实是 True boolean 值,您可以使用np.where
或df.dot
import numpy as np
#to keep the peformance of numpy arrays i would suggest doing
#df.columns = df.columns.map(lambda x : f'{x},')
df['places'] = df.dot(df.columns)
New York LA New Orleans places
ID
1.0 True False True New YorkNew Orleans
2.0 True False False New York
3.0 False False False
或使用 numpy。
df['places_2'] = np.where(df, df.columns, '').sum(axis=1)
New York LA New Orleans places_2
ID
1.0 True False True New YorkNew Orleans
2.0 True False False New York
3.0 False False False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.