【问题标题】:Pandas Split Function in ReversePandas 反向拆分函数
【发布时间】:2018-01-20 04:07:59
【问题描述】:

我有一个 Pandas 数据框,其中有一列如下所示:

    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 有没有更好的方法来反向分割这一列?

我尝试过使用正则表达式,它有效,但并非在所有行上都有效,因为您可以看到第 4 行和第 5 行与上面的略有不同。

任何帮助将不胜感激。

谢谢, 阿德里安

【问题讨论】:

  • 您希望生成的数据框是什么样的?在每个空间上拆分,还是其他?
  • 在每个空格上拆分都可以(正好相反)。我对“ManualConvertible”(或条目的最后一部分)感兴趣。我确信高级正则表达式可以解决这个问题,但我只知道基本表达式

标签: python pandas split


【解决方案1】:

下面是您的三个问题:

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

分解:

  1. df['Car_Make'] - 包含您要操作的数据的列
  2. .apply() - pandas DataFrame 和 Series 方法,将函数应用于 DataFrame 中的每一列或每一行,或应用于 Series 中的每一行。
  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 步向后迭代列表。

将所有内容放在一起,代码会遍历df['Car_Make'] 中的每条记录,拆分它们,反转拆分项的顺序,并将反转后的列表作为熊猫系列对象返回。

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

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

使用你目前所拥有的:

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

df['Car_Make'].apply(f)

3) 有没有更好的方法?

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

【讨论】:

  • 这很有帮助,正是我想要的。感谢您花时间向我解释这一点。非常感谢。
【解决方案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

【讨论】:

  • 那行得通。不知道有一个 rsplit 功能 - 做我需要它做的事情。如果你能解释一下(据我所知,Lambda 函数是如何工作的),那就太棒了!
【解决方案3】:

你在这里问的代码:

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.) 这里的主要功能是您的df['Car_Make'] 系列上的apply(),它本质上是一个字符串列表。 apply() 接受一个函数(很像map())并将其应用于df['Car_Make'] 系列。在这种情况下,它正在应用 lambda,它获取您的系列数据并将其用作函数的参数 x

6.) 将所有内容重新组合在一起。声明是:

  • df['Car_Make'] 字符串数据作为x 传递给lambda
  • lambda 然后处理x.split() 以将字符串数据拆分为列表。
  • 然后列表按切片[::-1] 以相反的顺序排序。
  • pd.Series() 现在将列表转换为 Series 对象。
  • 然后 Series 对象由 lambda 返回到您的 apply() 函数。
  • apply() 函数然后返回生成的 Series 对象,该对象方便地是您想要在 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 的知识。

【讨论】:

  • 非常感谢您对我的帮助。很有用。已经想到了我也可以应用这个的东西!珍惜你的时间
猜你喜欢
  • 2018-12-30
  • 2017-10-27
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多