Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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_String_Reverse - Fatal编程技术网

Python 交换名字和姓氏,并在熊猫中取首字母

Python 交换名字和姓氏,并在熊猫中取首字母,python,pandas,string,reverse,Python,Pandas,String,Reverse,我有以下数据集,其中包含两列完整的名称: df = pd.DataFrame({'Player1':[ 'Roger Federer ', 'Alex De Minaur'], 'Player2':['Bernabe Zapata Miralles','Andy Roddick']}) 输出: Player1 Player2 0 Roger Federer Bernabe Zapata Miralles 1 Alex De Mina

我有以下数据集,其中包含两列完整的名称:

df = pd.DataFrame({'Player1':[ 'Roger Federer ', 'Alex De Minaur'], 'Player2':['Bernabe Zapata Miralles','Andy Roddick']})
输出:

          Player1                  Player2
0  Roger Federer   Bernabe Zapata Miralles
1  Alex De Minaur             Andy Roddick
但是,我想在pandas数据框中转换这些名称,使其看起来像:

        Player1             Player2
0    Federer R.  Zapata Miralles B.
1  De Minaur A.          Roddick A.
完整的中间名(如有)-完整的姓氏-名字的第一个字母后跟一个点

关于stackoverflow,有几个类似的问题可能会有所帮助:


什么都行

这不是一个非常优雅的解决方案,但是如果数据帧少于几十万行,它就可以正常工作

定义一个只使用本机Python列表方法的函数

def convert_name(col):
    return col.split()[1:] + col.split()[0][0] + '.'
我们将把它应用于所需列中的每一行。它获取单元格值,一个字符串,将其拆分为单词,然后将它们组合为:名字后面的所有内容+名字的第一个字符+句号

要将其应用于数据帧,请使用lambda函数

df['Player1'] = df.Player1.apply(lambda x: convert_name(x))
这是Pandas版本的用于在行中循环的。它比循环更有效,并且更好地练习,尽管在大帧中仍然很慢


请注意,如果任何名称的格式不正确(例如,它们只有一个名称),则这将导致错误。您可以在
convert\u name
函数中实现错误处理。

字符串方法通常速度较慢,但您可以尝试数据帧执行的以下操作,然后返回原始形状:

s = df.stack()
s1 = s.str.split()
out = s1.str[1:].str.join(" ").add(" "+s.str[0].str[0].add(".")).unstack()


谢谢你的回答。真正的数据帧包含超过10万行,所以我认为这需要很长时间?对我来说,你的回答会导致一个错误:TypeError:“内置函数或方法”对象不可下标。你知道我怎样才能避免这个错误并使它工作吗?
print(out)

       Player1             Player2
0    Federer R.  Zapata Miralles B.
1  De Minaur A.          Roddick A.