python - 如何根据 Pandas 数据框中的行条件添加新列?

标签 python pandas dataframe

我想根据基于同一数据框的两个不同列的行条件添加新列。

我有以下Dataframe -

df1_data = {'e_id': {0:'101',1:'',2:'103',3:'',4:'105',5:'',6:''},
        'r_id': {0:'',1:'502',2:'',3:'504',4:'',5:'506',6:''}}
df=pd.DataFrame(df1_data)
print df

我想添加名为“sym”的新列。

条件-

  1. 如果“e_id”列值不为空,则 sym 列值为“e_id”列值。
  2. 如果“r_id”列值不为空,则 sym 列值为“r_id”列值。
  3. 如果“e_id”和“r_id”的两个列值都为空,则从 pandas 数据框中删除该特定行。

我尝试使用以下代码 -

df1_data = {'e_id': {0:'101',1:'',2:'103',3:'',4:'105',5:''},
        'r_id': {0:'',1:'502',2:'',3:'504',4:'',5:'506'}}

df=pd.DataFrame(df1_data)
print df

if df['e_id'].any():
    df['sym'] = df['e_id']
print df

if df['r_id'].any():
    df['sym'] = df['r_id']
print df

但它给了我一个错误的输出。

预期输出 -

  e_id r_id  sym
0  101       101
1       502  502
2  103       103
3       504  504
4  105       105
5       506  506

最佳答案

Pandas
使用 mask + fillna + assign

d1 = df.mask(df == '')
df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])

  e_id r_id  sym
0  101       101
1       502  502
2  103       103
3       504  504
4  105       105
5       506  506

它是如何工作的

  • 我需要掩盖你的 '' 值,假设你的意思是这些值是空的
  • 通过使用 fillna 如果 e_id 不为 null,我取 r_id 如果它不为 null,则取 r_id
  • dropna with subset=['sym'] 仅在新列为 null 时才删除该行,并且只有在 e_id 时才为 null > 和 r_id 为空

numpy
使用 np.where + assign

e = df.e_id.values
r = df.r_id.values
df.assign(
    sym=np.where(
        e != '', e,
        np.where(r != '', r, np.nan)
    )
).dropna(subset=['sym'])

  e_id r_id  sym
0  101       101
1       502  502
2  103       103
3       504  504
4  105       105
5       506  506

numpy v2
从值重建数据框

v = df.values
m = (v != '').any(1)
v = v[m]
c1 = v[:, 0]
c2 = v[:, 1]
pd.DataFrame(
    np.column_stack([v, np.where(c1 != '', c1, c2)]),
    df.index[m], df.columns.tolist() + ['sym']
)

  e_id r_id  sym
0  101       101
1       502  502
2  103       103
3       504  504
4  105       105
5       506  506

时间

%%timeit
e = df.e_id.values
r = df.r_id.values
df.assign(sym=np.where(e != '', e, np.where(r != '', r, np.nan))).dropna(subset=['sym'])
1000 loops, best of 3: 1.23 ms per loop

%%timeit
d1 = df.mask(df == '')
df.assign(sym=d1.e_id.fillna(d1.r_id)).dropna(subset=['sym'])
100 loops, best of 3: 2.44 ms per loop

%%timeit
v = df.values
m = (v != '').any(1)
v = v[m]
c1 = v[:, 0]
c2 = v[:, 1]
pd.DataFrame(
    np.column_stack([v, np.where(c1 != '', c1, c2)]),
    df.index[m], df.columns.tolist() + ['sym']
)
1000 loops, best of 3: 204 µs per loop

关于python - 如何根据 Pandas 数据框中的行条件添加新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43752187/

相关文章:

python - 将 pandas 多索引数据框插入特定位置的另一个多索引数据框

python - 使用 icontains 的 Django SearchVector

python - 可以在 Python 中访问 VB .net API

python - 将 MultiIndex 列合并为 1 级

R - 过滤数据框以仅包含列数符合条件的行

python - 根据另一个 Pandas 数据框的值填充一个 Pandas 数据框的最快方法是什么?

Python mysql 连接器加载语句在错误的目录 Windows 中搜索

python - 来自 json 输出的 python 中的变量赋值(通配符)

mysql - 相当于 pandas 'transform' 的 SQL 是什么?

python - 使用 pandas 的 if 语句抛出 "ValueError: The truth value of a Series is ambiguous"