基于pandas中列表列的条件,创建新列

5

我有一个包含列表列的数据框:

col_1            
[A, A, A, B, C]
[D, B, C]
[C]
[A, A, A]
NaN

我想创建一个新列,如果列表以3 * A开头,则返回1,否则返回0:
col_1              new_col           
[A, A, A, B, C]    1
[D, B, C]          0
[C]                0
[A, A, A]          1
NaN                0

我尝试过这个,但是没有成功:
df['new_col'] = df.loc[df.col_1[0:3] == [A, A, A]]
3个回答

2

因为可能存在非列表的值,所以可以使用if-else lambda函数来处理非列表情况下的0

print (df['col_1'].map(type))
0     <class 'list'>
1     <class 'list'>
2     <class 'list'>
3     <class 'list'>
4    <class 'float'>
Name: col_1, dtype: object

f = lambda x: int((x[:3]) == ['A','A','A']) if isinstance(x, list) else 0
df['new_col'] = df['col_1'].map(f)
#alternative
#df['new_col'] = df['col_1'].apply(f)
print (df)
             col_1  new_col
0  [A, A, A, B, C]        1
1        [D, B, C]        0
2              [C]        0
3        [A, A, A]        1
4              NaN        0

谢谢,返回一个错误:TypeError: 'float' object is not iterable 你认为是NaN的问题吗? - khaled koubaa
@khaledkoubaa - “print (df ['col_1'].map(type))” 是什么? - jezrael
如果有字符串而不是列表,可以在我的列表解决方案之前使用 df['col_1'] = df['col_1'].str.strip('[]').str.split(',') - jezrael

2

以下是使用map的另一种潜在解决方案:

import pandas as pd

#borrowing dataframe from @Alexendra
df = pd.DataFrame({
    'col_1': [
      ['A', 'A', 'A', 'B', 'C'],
      ['D', 'B', 'C'],
      ['C'],
      ['A', 'A', 'A']
    ]
})

df['new_col'] = df['col_1'].map(lambda x : 1  if x[0:3] == ['A','A','A']   else 0)

print(df)

输出:

             col_1  new_col
0  [A, A, A, B, C]        1
1        [D, B, C]        0
2              [C]        0
3        [A, A, A]        1

1

通过应用lambda的解决方案:

df = pd.DataFrame({
    'col_1': [          
      ['A', 'A', 'A', 'B', 'C'],
      ['D', 'B', 'C'],
      ['C'],
      ['A', 'A', 'A']
    ]
})

df['new_col'] = df.col_1.apply(lambda x: x[0:3] == ['A', 'A', 'A'] if isinstance(x, list) else False).view('i1')

df.head()

输出:

Output


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接