更改熊猫数据框列值

时间:2018-08-05 20:39:38

标签: python pandas pan

我有一个熊猫数据框。

commaSeparated

我更改了第一列中的值,以便根据某些条件在关键字中添加方括号(如果没有“ +”符号,请添加方括号)。

@Component({
...
})
export class MyComponent implements OnChanges {

  // ...

  private _commaSeparation = false;

  // ...

  get commaSeparation() {
    return this._commaSeparation;
  }

  set commaSeparation(value) {
    this._commaSeparation = value;

    if (value) {
       this.popupAlert();
    }
  }
}

这是添加括号的功能:

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

该函数产生了我想要的结果,但是在熊猫中有一种更整洁的方式,因此我不需要创建 df2 来添加第1列的输出(基本上是在原地进行更改) ?

解决方案: 根据@Inder的建议答案,可以将整个函数写成一行。

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

基于@RafaelC的答案。

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

2 个答案:

答案 0 :(得分:4)

就算了

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中,但是在具有更多100,000倍行的更大的df上看一下相同的操作:

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变得非常慢非常快,但是矢量化操作却没有

答案 1 :(得分:0)

您可以为此目的使用申请:

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