在 python 中转换数据框

Transforming data frame in python

我有以下数据集的情况:

ID      A     B    C
1      aa     -    -
2      -      bb   -
3      -      -    cc
4      aaa    -    -

应转换为以下数据框:

ID    A
 1    aa
 2    bb
 3    cc
 4    aa

所以本质上是移动行使其适合第一列

for i in range(len(df)):
    if df.at[i, 'A'] == '-':
        if df.at[i, 'B'] == '-':
            df.at[i, 'A'] = df.at[i, 'C']
        else:
            df.at[i, 'A'] = df.at[i, 'B']

df.drop(['B', 'C'], axis=1, inplace = True)

只需使用嵌套 if 语句来查找除 - 之外的列,并将该值分配给列 A.

中的值
**Output** : df

    ID  A
0   1   aa
1   2   bb
2   3   cc
3   4   aaa

你可以试试这个:

df.replace('-', np.nan, inplace=True)
df['new'] = df[df.columns[1:]].apply(
    lambda x: ''.join(x.dropna().astype(str)),
    axis=1
)
df = df[['ID', 'new']]
print(df)

输出:

   ID  new
0   1   aa
1   2   bb
2   3   cc
3   4  aaa

您可以在 replace 符号 '-' 之后使用 bfill 和沿列的轴 by nan:

df_ = df.replace('-', np.nan).bfill(1)[['ID', 'A']]
print(df_)
  ID    A
0  1   aa
1  2   bb
2  3   cc
3  4  aaa

您可以使用 df.replace- 替换为 np.nan 并将 'ID' 设置为索引,然后 df.stackdf.droplevel

df.replace('-',np.nan).set_index('ID').stack().droplevel(1)

ID
1     aa
2     bb
3     cc
4    aaa
dtype: object