根据条件在熊猫中创建新列

时间:2020-07-02 08:12:27

标签: python pandas

我有一个带有这样的列的数据框:

    column_1
0   0.75 / 1 / 1.25 
1   0.25 / 0 / -0.25 / 0
2   0 / -0.25 / 0 / -0.25 / 0
3   0 / -0.25 
4   0.5 / 0.25
5   0.25

每行由连续的数字链组成(数字之间的移动0.25, 例如从0到0.25到0.5,或从-1到-1.25) 我只需要不出现相同次数2次(或更多次)的行,例如:0.25 / 0 / 0.25 / 0 / 0.25 / 0或0.5 / 0.25 / 0.5 我不需要只有一个数字的行,例如0.25

我想创建一个新列,并保留满足此条件的人(相同的数字不会出现2次(或更多))

    column_1                     new_column
0   0.75 / 1 / 1.25              0.75 / 1 / 1.25 
1   0.25 / 0 / -0.25 / 0         NaN
2   0 / -0.25 / 0 / -0.25 / 0    NaN
3   0 / -0.25                    0 / -0.25 
4   0.5 / 0.25                   0.5 / 0.25
5   0.25                         NaN

3 个答案:

答案 0 :(得分:3)

这里是一种方法,将这些字符串拆分并爆炸,然后仅保留Series.is_uniqueTrue且具有多个元素的那些字符串:

l = df.column_1.str.split(' / ')
m = (l.explode()
      .groupby(level=0, sort=False)
      .apply(lambda x: x.is_unique) 
       & (l.str.len()>1))
df['new_column'] = df.where(m)

print(df)

                    column_1        new_column
0           0.75 / 1 / 1.25   0.75 / 1 / 1.25 
1       0.25 / 0 / -0.25 / 0               NaN
2  0 / -0.25 / 0 / -0.25 / 0               NaN
3                 0 / -0.25         0 / -0.25 
4                 0.5 / 0.25        0.5 / 0.25
5                       0.25               NaN

答案 1 :(得分:2)

使用splitstrip创建一个数字帮助列表系列。比较列表的长度及其对应的set,并使用布尔逻辑创建new_column

s = df['column_1'].apply(lambda x: [x.strip() for x in x.split('/')])

df['new_column'] = df.loc[(s.str.len() == s.apply(set).str.len()) & (s.str.len() != 1), 'column_1']

[出]

                    column_1       new_column
0            0.75 / 1 / 1.25  0.75 / 1 / 1.25
1       0.25 / 0 / -0.25 / 0              NaN
2  0 / -0.25 / 0 / -0.25 / 0              NaN
3                  0 / -0.25        0 / -0.25
4                 0.5 / 0.25       0.5 / 0.25
5                       0.25              NaN

答案 2 :(得分:1)

替代答案:

# Import libraries
import pandas as pd
import numpy as np

# Create DataFrame
df = pd.DataFrame({
    'column_1': ['0.75 / 1 / 1.25','0.25 / 0 / -0.25 / 0','0 / -0.25 / 0 / -0.25 / 0',
                 '0 / -0.25', '0.5 / 0.25', 0.25, np.nan, 'NaN'
                ]
})
# To handle np.NaN's using .fillna()
df['column_1'] = df['column_1'].fillna('0')

# To handle cases where numeric values in column
df['column_1'] = df['column_1'].astype(str)

# Split string to list and compare
df['split'] = df['column_1'].apply(lambda x: [i.replace('-','') for i in x.split(' / ')])
df['new_column'] = df['split'].apply(lambda x: np.nan if len(set(x))==1 else
                                     x if len(set(x))==len(x) 
                                     else np.nan)
df = df.drop('split', axis=1) # drop column

输出

print(df)

                    column_1       new_column
0            0.75 / 1 / 1.25  [0.75, 1, 1.25]
1       0.25 / 0 / -0.25 / 0              NaN
2  0 / -0.25 / 0 / -0.25 / 0              NaN
3                  0 / -0.25        [0, 0.25]
4                 0.5 / 0.25      [0.5, 0.25]
5                       0.25              NaN
6                          0              NaN
7                        NaN              NaN