我有一个带有这样的列的数据框:
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
答案 0 :(得分:3)
这里是一种方法,将这些字符串拆分并爆炸,然后仅保留Series.is_unique
为True
且具有多个元素的那些字符串:
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)
使用split
和strip
创建一个数字帮助列表系列。比较列表的长度及其对应的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