我有一个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行与上面略有不同。
非常感谢任何帮助。
谢谢, 阿德里安
答案 0 :(得分:4)
以下是您的三个问题:
1)为什么df['Car_Make'].apply(lambda x:pd.Series(x.split()[::-1]))
有效?
分解:
df['Car_Make']
- 包含您要操作的数据的列.apply()
- 一个pandas
DataFrame和Series方法,它将函数应用于DataFrame中的每一列或每一行,或系列中的每一行。lambda x:
- .apply()
方法将应用于系列的每一行的函数。 x
表示记录对象,在您的情况下是包含Car_Make
条目的字符串。pd.Series()
- 这会将其中的值转换为pandas
系列。x.split()
- 如第3点所述,x
是您的字符串对象,而split()
是一个字符串方法,当没有参数传递时,默认为按字符串拆分字符串空格并将每个拆分对象返回到列表中。[::-1]
- 一个方便的列表迭代器,用于反转列表,例如x.split()
返回的列表。列表迭代的语法是[start_index:end_index:step]
。使用-1步骤向后遍历列表。将所有这些放在一起,并且该代码遍历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
对象。 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
的内容。