Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据条件在熊猫中创建新列_Python_Pandas - Fatal编程技术网

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

Python 根据条件在熊猫中创建新列,python,pandas,Python,Pandas,我有一个dataframe,列如下: 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 我只需要相同数字不会出现两次或两次以上的行,例如:0.25/0/0.25/0/0.25/0或0.5/

我有一个dataframe,列如下:

    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 我只需要相同数字不会出现两次或两次以上的行,例如: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

使用split和strip创建一系列数字列表。将列表的长度与其对应的集合进行比较,并使用布尔逻辑创建新的_列:

[外]


使用split和strip创建一系列数字列表。将列表的长度与其对应的集合进行比较,并使用布尔逻辑创建新的_列:

[外]


这里有一种方法可以拆分这些字符串并分解,然后只保留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)

这里有一种方法可以拆分这些字符串并分解,然后只保留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)
备选答案:

# 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
备选答案:

# 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

它返回一个异常:“Series”对象没有属性“explode”它返回一个异常:“Series”对象没有属性“explode”返回一个异常:AttributeError:“float”对象没有属性“split”返回一个异常:AttributeError:“float”对象没有属性“split”返回一个异常:AttributeError:“float”对象没有属性属性“split”它可能是由于列_1中的数值造成的。我已经更新了代码,首先将列_1设置为字符串。我将列转换为字符串,但返回一个新列,其中包含NaN所有值均为NaN1。您能否确认上面答案中的代码是否适用于您?因为它可以在我的电脑上正常工作。2在不查看整个数据集的情况下,很难诊断问题。我猜列_1可能混合了不同的数据类型。你能在第1栏中发布与上述问题不同的数据样本吗?3我正在使用熊猫版本:1.0.3;Python:3.7.4列_1包含一些NaN,这可能是原因?返回异常:AttributeError:“float”对象没有属性“split”,这可能是由于列_1中的数值造成的。我已经更新了代码,首先将列_1设置为字符串。我将列转换为字符串,但返回一个新列,其中包含NaN所有值均为NaN1。您能否确认上面答案中的代码是否适用于您?因为它可以在我的电脑上正常工作。2在不查看整个数据集的情况下,很难诊断问题。我猜列_1可能混合了不同的数据类型。你能在第1栏中发布与上述问题不同的数据样本吗?3我正在使用熊猫版本:1.0.3;Python:3.7.4列_1包含一些NaN,这可能是原因吗?