反转中的熊猫分裂功能

时间:2018-01-20 04:08:00

标签: python pandas split

我有一个Pandas Dataframe,其列如下所示:

    Car_Make
0   2017 Abarth 124 Spider ManualConvertible
1   2017 Abarth 124 Spider AutoConvertible
2   2017 Abarth 124 Spider ManualConvertible
3   2017 Abarth 124 Spider AutoConvertible
4   2017 Abarth 595 ManualHatch
5   2017 Abarth 595 AutoHatch

三个问题:

1 How to save split data in panda in reverse order? - 这解决了我的问题,但我不知道它的工作原理或原因 - 有人可以向我解释一下吗?我讨厌复制粘贴而不理解它为什么会起作用

df['Car_Make'].apply(lambda x:pd.Series(x.split()[::-1])) 

2我尝试使用用户定义的函数(我可以再次使用)复制它,但是它似乎不起作用(任何帮助理解为什么以及转换Lambda的正确方法)函数进入用户定义的函数

def f(x):
    df[x] = pd.Series(x.split()[::-1])
    return df

3有没有更好的方法可以按空格分割此列?

我尝试使用Regex,但不是所有行,因为您可以看到第4行和第5行与上面略有不同。

非常感谢任何帮助。

谢谢, 阿德里安

3 个答案:

答案 0 :(得分:4)

以下是您的三个问题:

1)为什么df['Car_Make'].apply(lambda x:pd.Series(x.split()[::-1]))有效?

分解:

  1. df['Car_Make'] - 包含您要操作的数据的列
  2. .apply() - 一个pandas DataFrame和Series方法,它将函数应用于DataFrame中的每一列或每一行,或系列中的每一行。
  3. lambda x: - .apply()方法将应用于系列的每一行的函数。 x表示记录对象,在您的情况下是包含Car_Make条目的字符串。
  4. pd.Series() - 这会将其中的值转换为pandas系列。
  5. x.split() - 如第3点所述,x是您的字符串对象,而split()是一个字符串方法,当没有参数传递时,默认为按字符串拆分字符串空格并将每个拆分对象返回到列表中。
  6. [::-1] - 一个方便的列表迭代器,用于反转列表,例如x.split()返回的列表。列表迭代的语法是[start_index:end_index:step]。使用-1步骤向后遍历列表。
  7. 将所有这些放在一起,并且该代码遍历df['Car_Make']中的每个记录,拆分它们,颠倒拆分项的顺序,并将反转列表作为pandas Series对象返回。

    2)用定义的函数复制它。

    您非常接近,只是函数需要将行/记录作为其参数,并且需要在.apply()方法中调用。你想要做的是替换lambda x,而不是它的应用方式。

    使用目前为止所拥有的内容:

    def f(x):
        return pd.Series(x.split()[::-1])
    
    df['Car_Make'].apply(f)
    

    3)有更好的方法吗?

    如果你想分割一个字符串然后反转项目的顺序,不,这是一个很好的方法。如果您只想从右侧开始拆分字符串的某个部分,那么rsplit()是一个很好的方法。

答案 1 :(得分:2)

这就是你要找的东西:

df.car_make.str.rsplit(' ', 1, expand=True)
# returns:
                        0                  1
0  2017 Abarth 124 Spider  ManualConvertible
1  2017 Abarth 124 Spider    AutoConvertible
2  2017 Abarth 124 Spider  ManualConvertible
3  2017 Abarth 124 Spider    AutoConvertible
4         2017 Abarth 595        ManualHatch
5         2017 Abarth 595          AutoHatch

答案 2 :(得分:1)

您在此处提出的代码:

df['Car_Make'].apply(lambda x:pd.Series(x.split()[::-1]))

这里有几件事情发生了:

1。)首先,lambda基本上是即兴功能。在这种情况下,它是一个带有参数x的未命名函数,并返回pd.Series(x.split()[::-1]。有关x的更多信息。

2。)pd.Series(...)如您所知,创建一个与原始数据非常相似的pandas Series对象。

3。)x.split()默认将字符串x与空格分隔为分隔符。

4.)[::-1]位是slice.。与range()非常相似,需要3个参数[start: end: steps]。在这种情况下,它说要从开始到结束获取字符串,但是使用-1作为步骤,即反过来。请注意,只有end参数是必需的。

5.。)这里的主要功能是apply()系列df['Car_Make'],基本上是一个字符串列表。 apply()采用函数(非常类似map())并将其应用于df['Car_Make']系列。在这种情况下,它应用lambda,它获取系列的数据并将其用作函数的参数x

6。)把所有东西放回原处。声明是:

  • df['Car_Make']字符串数据x传递给lambda
  • lambda然后处理x.split()以将字符串数据拆分为列表。
  • 然后,切片[::-1]以相反的顺序对列表进行排序。
  • pd.Series()现在将列表转换为Series对象。
  • 然后lambda将Series对象返回到apply()函数。
  • 然后apply()函数返回生成的Series对象,方便地,它是系列中所需的反向排序字符串。

如果您关心的是最后一次分裂,那么您真的不需要进行反向拆分。您可以轻松完成以下操作,它会立即返回拆分中的最后一项:

data['Car Make'].apply(lambda x: pd.Series({'Car_Make':x.split()[-1]}))

            Car_Make
0  ManualConvertible
1    AutoConvertible
2  ManualConvertible
3    AutoConvertible
4        ManualHatch
5          AutoHatch

感谢您提出这个问题,我在这个答案中也学到了一些关于pandas的内容。