orgelzyklus
orgelzyklus

Reputation: 309

How do I add conditionally to a selection of cells in a pandas dataframe column when the the column is a series of lists?

Here is a simplified version of my current dilemma.

Here is the dataframe:

            x      y       A       B 
0           ding   ding    [0, 1]  [0, 0] 
1           ding   dong    [0, 1]  [0, 0] 
2           ding   ding    [0, 1]  [0, 0] 
3           ding   ding    [0, 1]  [0, 0] 
4           ding   dong    [0, 1]  [0, 0] 
5           ding   ding    [0, 1]  [0, 0] 
6           ding   ding    [0, 1]  [0, 0] 

How do I add 1 to those cells in column B where x != y. The cells are lists and the 1 should be inserted at index 1.

The resultant table would look as follows:

            x      y       A       B 
0           ding   ding    [0, 1]  [0, 0] 
1           ding   dong    [0, 1]  [0, 1] 
2           ding   ding    [0, 1]  [0, 0] 
3           ding   ding    [0, 1]  [0, 0] 
4           ding   dong    [0, 1]  [0, 1] 
5           ding   ding    [0, 1]  [0, 0] 
6           ding   ding    [0, 1]  [0, 0]

Many thanks.

Upvotes: 2

Views: 72

Answers (2)

Anton Protopopov
Anton Protopopov

Reputation: 31682

You could apply lambda:

df[df.x != df.y].B.apply(lambda x: x[:-1] + [1])

Example:

In [283]: df
Out[283]:
      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 0]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 0]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

mask = df.x != df.y
df.B[mask] = df.B[mask].apply(lambda x: x[:-1] + [1])

In [289]: df
Out[289]:
      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 1]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 1]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

Upvotes: 1

Mike Müller
Mike Müller

Reputation: 85492

This works:

def last_one(lst):
    lst[1] = 1

df[df.x != df.y].B.apply(last_one)

df before:

      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 0]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 0]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

and df after:

      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 1]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 1]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

Upvotes: 2

Related Questions