【问题标题】:Create new dataframe column from the values of 2 other columns从其他 2 列的值创建新的数据框列
【发布时间】:2020-04-18 19:55:18
【问题描述】:
我的数据框中有 2 列。在任何一个实例(行)中,至少其中一列中包含字符串值,另一列中可能包含 NoneType 或另一个字符串。
我想创建第三列,在其中一列是 NoneType 的情况下,将采用字符串的值。在两者都是字符串的情况下,将两者连接起来。
我该怎么做?
column1 column2 column3
0 hello None hello
1 None goodbye goodbye
2 hello goodbye hello, goodbye
【问题讨论】:
标签:
python
string
pandas
dataframe
lambda
【解决方案1】:
使用na_rep='',因此缺少值的连接不会导致整行的NaN。然后 strip 由于缺少数据而加入的任何多余分隔符(假设分隔符也不会开始或结束您的任何单词)。
import pandas as pd
df = pd.DataFrame({'column1': ['hello', None, 'hello'],
'column2': [None, 'goodbye', 'goodbye']})
sep = ', '
df['column3'] = (df['column1'].str.cat(df['column2'], sep=sep, na_rep='')
.str.strip(sep))
print(df)
column1 column2 column3
0 hello None hello
1 None goodbye goodbye
2 hello goodbye hello, goodbye
对于许多列,中间可能存在缺失数据的条纹,上述方法无法删除多余的分隔符。相反,您可以沿行使用慢速lambda。我们在删除空值后加入所有值:
df['column3'] = df.apply(lambda row: ', '.join(row.dropna()), axis=1)
【解决方案2】:
解决方案
您可以将所有NaNs 替换为空字符串,然后将列(A 和 B)联系起来以创建列 C。
df2 = df.fillna('')
df['C'] = df2.A.str.strip() + df2.B.str.strip(); #del df2;
print(df)
输出:
A B C=A+B
0 1 3 13
1 2 None 2
2 dog dog dogdog
3 None None
4 snake 20 snake20
5 cat None cat
虚拟数据
d = {
'A': ['1', '2', 'dog', None, 'snake', 'cat'],
'B': ['3', None, 'dog', None, '20', None]
}
df = pd.DataFrame(d)
print(df)
输出:
A B
0 1 3
1 2 None
2 dog dog
3 None None
4 snake 20
5 cat None