无法在条件上拆分数据框中的列的值

时间:2018-04-07 20:26:15

标签: python pandas

我有一个看起来像

的输入数据框
   0      1
0  0  10,30
1  1  10,40
2  2  20,50

现在我正在尝试拆分第二列并将值存储到新列中。这里,如果A列中的值可以被2整除,那么从B列得到第一个值,否则得到第二个值,如下面的

   A      B   C
0  0  10,30  10
1  1  10,40  10
2  2  20,50  50

我的代码:

import pandas as pd
import numpy as np

df = pd.DataFrame([(0, '10,30'), (1, '10,40'), (2, '20,50')])

df['n'] = np.where(df[0] % 2 == 0, df[0], 0 )
df[2] = (df[1]).str.split(',').str[df['n'].fillna(0)

print(df)

它抛出一个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

2 个答案:

答案 0 :(得分:1)

我认为需要lookup split ed列到DataFrame并将boolean mask转换为int,以便按0选择第一列,将1添加到第二列:

df[2] = df[1].str.split(',', expand=True).lookup(df.index, (df[0] % 2 == 0).astype(int))
print (df)
   0      1   2
0  0  10,30  30
1  1  10,40  10
2  2  20,50  50

print (df[0] % 2 == 0)
0     True
1    False
2     True
Name: 0, dtype: bool

#select second, first, second column
print ((df[0] % 2 == 0).astype(int))
0    1
1    0
2    1
Name: 0, dtype: int32

改变条件的类似解决方案:

df[2] = df[1].str.split(',', expand=True).lookup(df.index, (df[0] % 2 != 0).astype(int))
print (df)
   0      1   2
0  0  10,30  10
1  1  10,40  40
2  2  20,50  20
print (df[0] % 2 != 0)
0    False
1     True
2    False
Name: 0, dtype: bool

#select first, second, first column
print ((df[0] % 2 != 0).astype(int))
0    0
1    1
2    0
Name: 0, dtype: int32

print (df[1].str.split(',', expand=True))
    0   1
0  10  30 <-first 10
1  10  40 <-second 40
2  20  50 <-first 20

答案 1 :(得分:1)

我认为您也可以使用apply方法实现它。

首先让我们将第1列与目标索引分开放在一个新的数据帧中df1

df1 = pd.concat({i:df[1].str.split(',').str.get(i) for i in range(2)}, axis=1)
df1['ind'] = df[0] % 2
df1

    0   1   ind
0   10  30  0
1   10  40  1
2   20  50  0

接下来,您可以使用

将新值放入第2列
df[2] = df1.apply(lambda p: p.loc[p["ind"]], axis=1)
df[2]

0    10
1    40
2    20
dtype: object

如果您不想创建新数据框,还可以执行以下操作以获得相同的结果

df[2] = df1.apply(lambda p: p.loc[1].split(",")[p.loc[0] % 2], axis=1)