【问题标题】:Change pandas data frame column values inplace就地更改熊猫数据框列值
【发布时间】:2018-08-05 20:39:37
【问题描述】:

我有一个熊猫数据框。

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'] + "]"

【问题讨论】:

  • @coldspeed 将关键字与另一个文档匹配

标签: python pandas pan


【解决方案1】:

求和

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 变得非常非常慢非常快,但矢量化操作不会

【讨论】:

  • @mahf_i 有比使用apply 更好的方法。我将编辑我的答案
  • 你能解释一下为什么这比apply更好吗?
  • @mahf_i 因为应用很慢。我添加了一些时间 :)
【解决方案2】:

你可以使用 apply 来达到这个目的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2022-11-02
    • 2018-02-20
    • 2021-12-29
    • 2017-01-16
    • 1970-01-01
    • 2020-08-06
    相关资源
    最近更新 更多