就地更改 pandas 数据框列值
Change pandas data frame column values inplace
我有一个 pandas 数据框。
keyword adGroup goal6Value adCost
aaaa (not set) 0 0.0
+bbbb (not set) 0 0.0
+cccc (not set) 2072 0.0
dddd (not set) 0 0.0
我更改了第一列中的值,以根据某些条件为关键字添加括号(如果没有“+”符号,添加括号)。
keyword adGroup goal6Value adCost
[aaaa] (not set) 0 0.0
+bbbb (not set) 0 0.0
+cccc (not set) 2072 0.0
[dddd] (not set) 0 0.0
这是为添加括号而创建的函数:
def add_bracket(df):
df["keyword"] = df["keyword"].astype('str')
keyword_list = list()
for index, row in df.iterrows():
keyword = row["keyword"]
if keyword.find("+") < 0:
keyword = "[" + keyword + "]"
keyword_list.append(keyword)
kw = pd.DataFrame(keyword_list, columns = ['Keyword2'])
df2 = pd.concat([df, kw], axis=1).drop(columns["keyword"]).rename(columns={'Keyword2': 'keyword'})
df2 = df2[['keyword', 'adGroup', 'goal6Value', 'adCost']]
return df2
该函数产生了我想要的结果,但是 pandas 中是否有更简洁的方法,这样我就不需要创建 df2 来添加输出第 1 列(基本上是就地进行更改)?
解法:
根据@Inder 的建议答案,整个函数可以写在一行中。
df["keyword"] = df.keyword.apply(lambda x: "[" + x + "]" if x.find("+") < 0 else x)
基于@RafaelC 的回答。
mask = df.keyword.str.contains('+', regex=False)
df.loc[~mask, 'keyword'] = "[" + df.loc[~mask, 'keyword'] + "]"
您可以为此目的申请:
df["keyword"]=df.keyword.apply(lambda x:[x])
所以它 dataframe.name_of_column.apply("operation")
输出将是:
keyword adGroup goal6Value adCost
[aaaa] (not set) 0 0.0
[bbbb] (not set) 0 0.0
[cccc] (not set) 2072 0.0
[dddd] (not set) 0 0.0
求和
mask = df.keyword.str.contains('+', regex=False)
df.loc[~mask, 'keyword'] = "[" + df.loc[~mask, 'keyword'] + "]"
keyword
0 [aaaa]
1 [bbbb]
2 [cccc]
3 [dddd]
为什么这比 apply
好?
看看时间安排:
%timeit "[" + df.loc[mask, 'keyword'] + "]"
348 µs ± 24.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.keyword.apply(lambda x:[x])
112 µs ± 3.46 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
哇,这么快就申请了?
不完全是。也许在一个非常非常小的 df
中,但在一个更大的 df
上看一下相同的操作,行数增加了 100,000 倍:
df = pd.concat([df]*100000)
%timeit "[" + df.loc[mask, 'keyword'] + "]"
4.54 ms ± 135 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df.keyword.apply(lambda x:[x])
129 ms ± 2.74 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
所以apply
变得非常非常慢非常快,但是矢量化操作不会
我有一个 pandas 数据框。
keyword adGroup goal6Value adCost
aaaa (not set) 0 0.0
+bbbb (not set) 0 0.0
+cccc (not set) 2072 0.0
dddd (not set) 0 0.0
我更改了第一列中的值,以根据某些条件为关键字添加括号(如果没有“+”符号,添加括号)。
keyword adGroup goal6Value adCost
[aaaa] (not set) 0 0.0
+bbbb (not set) 0 0.0
+cccc (not set) 2072 0.0
[dddd] (not set) 0 0.0
这是为添加括号而创建的函数:
def add_bracket(df):
df["keyword"] = df["keyword"].astype('str')
keyword_list = list()
for index, row in df.iterrows():
keyword = row["keyword"]
if keyword.find("+") < 0:
keyword = "[" + keyword + "]"
keyword_list.append(keyword)
kw = pd.DataFrame(keyword_list, columns = ['Keyword2'])
df2 = pd.concat([df, kw], axis=1).drop(columns["keyword"]).rename(columns={'Keyword2': 'keyword'})
df2 = df2[['keyword', 'adGroup', 'goal6Value', 'adCost']]
return df2
该函数产生了我想要的结果,但是 pandas 中是否有更简洁的方法,这样我就不需要创建 df2 来添加输出第 1 列(基本上是就地进行更改)?
解法: 根据@Inder 的建议答案,整个函数可以写在一行中。
df["keyword"] = df.keyword.apply(lambda x: "[" + x + "]" if x.find("+") < 0 else x)
基于@RafaelC 的回答。
mask = df.keyword.str.contains('+', regex=False)
df.loc[~mask, 'keyword'] = "[" + df.loc[~mask, 'keyword'] + "]"
您可以为此目的申请:
df["keyword"]=df.keyword.apply(lambda x:[x])
所以它 dataframe.name_of_column.apply("operation")
输出将是:
keyword adGroup goal6Value adCost
[aaaa] (not set) 0 0.0
[bbbb] (not set) 0 0.0
[cccc] (not set) 2072 0.0
[dddd] (not set) 0 0.0
求和
mask = df.keyword.str.contains('+', regex=False)
df.loc[~mask, 'keyword'] = "[" + df.loc[~mask, 'keyword'] + "]"
keyword
0 [aaaa]
1 [bbbb]
2 [cccc]
3 [dddd]
为什么这比 apply
好?
看看时间安排:
%timeit "[" + df.loc[mask, 'keyword'] + "]"
348 µs ± 24.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.keyword.apply(lambda x:[x])
112 µs ± 3.46 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
哇,这么快就申请了?
不完全是。也许在一个非常非常小的 df
中,但在一个更大的 df
上看一下相同的操作,行数增加了 100,000 倍:
df = pd.concat([df]*100000)
%timeit "[" + df.loc[mask, 'keyword'] + "]"
4.54 ms ± 135 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df.keyword.apply(lambda x:[x])
129 ms ± 2.74 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
所以apply
变得非常非常慢非常快,但是矢量化操作不会