python pandas DataFrame - 将列表分配给多个单元格
python pandas DataFrame - assign a list to multiple cells
我有一个类似
的DataFrame
name col1 col2
a aa 123
a bb 123
b aa 234
和一个列表
[1, 2, 3]
我想将 col1 = 'aa' 的每一行的 col2 替换为
这样的列表
name col1 col2
a aa [1, 2, 3]
a bb 123
b aa [1, 2, 3]
我试过
df.loc[df[col1] == 'aa', col2] = [1, 2, 3]
但它给了我错误:
ValueError: could not broadcast input array from shape (xx,) into shape (yy,)
我该如何解决这个问题?
具有 if/else 的列表推导应该有效
df['col2'] = [x['col2'] if x['col1'] != 'aa' else [1,2,3] for ind,x in df.iterrows()]
使用for循环是安全的
df.col2 = df.col2.astype(object)
for x in df.index:
if df.at[x,'col1'] == 'aa':
df.at[x,'col2'] = [1,2,3]
df
name col1 col2
0 a aa [1, 2, 3]
1 a bb 123
2 b aa [1, 2, 3]
您还可以使用:
data = {'aa':[1,2,3]}
df['col2'] = np.where(df['col1'] == 'aa', df['col1'].map(data), df['col2'])
您应该小心使用它,因为这样做会将列表更改为两个位置:
df['col2'].loc[0].append(5)
print(df)
#OUTPUT
name col1 col2
0 a aa [1, 2, 3, 5]
1 a bb 123
2 b aa [1, 2, 3, 5]
但这很好:
df = df.loc[1:]
print(df)
#OUTPUT
name col1 col2
1 a bb 123
2 b aa [1, 2, 3]
让它变得简单。 np.where 应该可以。下面的代码
df['col2']=np.where(df['col1']=='aa', str(lst), df['col2'])
或者使用 pd.Series,列表锁定在双括号中
df['col2']=np.where(df['col1']=='aa', pd.Series([lst]), df['col2'])
import pandas as pd
df = pd.DataFrame({"name":["a","a","b"],"col1":["aa","bb","aa"],"col2":[123,123,234]})
l = [1,2,3]
df["col2"] = df.apply(lambda x: l if x.col1 == "aa" else x.col2, axis =1)
df
我有一个类似
的DataFramename col1 col2
a aa 123
a bb 123
b aa 234
和一个列表
[1, 2, 3]
我想将 col1 = 'aa' 的每一行的 col2 替换为
这样的列表name col1 col2
a aa [1, 2, 3]
a bb 123
b aa [1, 2, 3]
我试过
df.loc[df[col1] == 'aa', col2] = [1, 2, 3]
但它给了我错误:
ValueError: could not broadcast input array from shape (xx,) into shape (yy,)
我该如何解决这个问题?
具有 if/else 的列表推导应该有效
df['col2'] = [x['col2'] if x['col1'] != 'aa' else [1,2,3] for ind,x in df.iterrows()]
使用for循环是安全的
df.col2 = df.col2.astype(object)
for x in df.index:
if df.at[x,'col1'] == 'aa':
df.at[x,'col2'] = [1,2,3]
df
name col1 col2
0 a aa [1, 2, 3]
1 a bb 123
2 b aa [1, 2, 3]
您还可以使用:
data = {'aa':[1,2,3]}
df['col2'] = np.where(df['col1'] == 'aa', df['col1'].map(data), df['col2'])
您应该小心使用它,因为这样做会将列表更改为两个位置:
df['col2'].loc[0].append(5)
print(df)
#OUTPUT
name col1 col2
0 a aa [1, 2, 3, 5]
1 a bb 123
2 b aa [1, 2, 3, 5]
但这很好:
df = df.loc[1:]
print(df)
#OUTPUT
name col1 col2
1 a bb 123
2 b aa [1, 2, 3]
让它变得简单。 np.where 应该可以。下面的代码
df['col2']=np.where(df['col1']=='aa', str(lst), df['col2'])
或者使用 pd.Series,列表锁定在双括号中
df['col2']=np.where(df['col1']=='aa', pd.Series([lst]), df['col2'])
import pandas as pd
df = pd.DataFrame({"name":["a","a","b"],"col1":["aa","bb","aa"],"col2":[123,123,234]})
l = [1,2,3]
df["col2"] = df.apply(lambda x: l if x.col1 == "aa" else x.col2, axis =1)
df