Python 不必传递整行以在pandas中创建新列?
我使用以下函数从电影标题计算电影分辨率:Python 不必传递整行以在pandas中创建新列?,python,pandas,Python,Pandas,我使用以下函数从电影标题计算电影分辨率: def new__resolution(row): resolution = row['resolution'] if resolution == '4k/UHD': resolution = 'UHD' if resolution not in ('SD', 'HD', 'UHD'): resolution = None if '_HD_' in row['file_name']: resolution = 'HD'
def new__resolution(row):
resolution = row['resolution']
if resolution == '4k/UHD': resolution = 'UHD'
if resolution not in ('SD', 'HD', 'UHD'): resolution = None
if '_HD_' in row['file_name']: resolution = 'HD'
if '_SD_' in row['file_name']: resolution = 'SD'
return resolution
我创建的新列如下所示:
df['new__resolution'] = df.apply(new__resolution, axis=1)
我的问题是,这似乎是一种创建一个通过整行的新列的高压方法。有没有更好的方法,比如只传递列本身?比如:
df['new__resolution'] = df['resolution'].apply(new__resolution)
函数的前两行是:
def new__resolution(value):
resolution = value
当传递单个列而不是整行时,该如何执行此操作
更新:事实上,现在我回顾了这个问题,我不能只传递一列,因为它取决于两个字段,而不仅仅是一个字段(分辨率、文件名)。考虑到这一点,有没有办法只传递两列,还是最好只传递整行?将函数修改为
def new__resolution(row):
resolution = row
if resolution == '4k/UHD': resolution = 'UHD'
if resolution not in ('SD', 'HD', 'UHD'): resolution = None
if '_HD_' in row['file_name']: resolution = 'HD'
if '_SD_' in row['file_name']: resolution = 'SD'
return resolution
df['new__resolution'] = df['resolution'].map(new__resolution)
如果两列
df['new__resolution'] = df[['col1','col2']].apply(new__resolution, axis=1)
将您的函数修改为
def new__resolution(row):
resolution = row
if resolution == '4k/UHD': resolution = 'UHD'
if resolution not in ('SD', 'HD', 'UHD'): resolution = None
if '_HD_' in row['file_name']: resolution = 'HD'
if '_SD_' in row['file_name']: resolution = 'SD'
return resolution
df['new__resolution'] = df['resolution'].map(new__resolution)
如果两列
df['new__resolution'] = df[['col1','col2']].apply(new__resolution, axis=1)
谢谢,你能不能对这两个函数和你在这里做的事情再详细一点?主要是
映射
和应用
之间的差异。另外,第二个函数的函数签名是什么样的?它是否仍然接受一行,并且传递的行只包含这两列?@David542当对series进行映射时,它与应用相同,但对于dataframe,我们需要应用。由于您拉出了行,所以我们尝试尽可能减少不必要的列以加快速度。我明白了。我现在明白第二个了。不过,在地图
vsapply
上仍然有点模糊。另外,你会建议上面两种方法中的哪一种?@David542我会应用,但是map对索引有好处,apply不是,你可以使用第二种方法,在第一种方法的一半时间内返回df.index.map()而不是df.index.applythanks。谢谢,你能对这两个函数和你在这里做的事情做一些详细说明吗?主要是映射
和应用
之间的差异。另外,第二个函数的函数签名是什么样的?它是否仍然接受一行,并且传递的行只包含这两列?@David542当对series进行映射时,它与应用相同,但对于dataframe,我们需要应用。由于您拉出了行,所以我们尝试尽可能减少不必要的列以加快速度。我明白了。我现在明白第二个了。不过,在地图
vsapply
上仍然有点模糊。另外,你会建议上面两种方法中的哪一种?@David542我会应用,但map对索引有好处,apply不是,你可以使用第二种方法,在第一种方法的一半时间内返回。