pandas - 将一个序列添加到数据框中会导致出现NaN值

12 投票
3 回答
11563 浏览
提问于 2025-04-18 09:34

我有一个数据框,看起来像这样:

d = {'Col_1' : pd.Series(['A', 'A', 'A', 'B']),
     'Col_2' : pd.Series(['B', 'C', 'B', 'D']),
     'Col_3' : pd.Series([np.nan, 'D', 'C', np.nan]),
     'Col_4' : pd.Series([np.nan, np.nan, 'D', np.nan]),
     'Col_5' : pd.Series([np.nan, np.nan, 'E', np.nan]),}
df = pd.DataFrame(d)

Col_1  Col_2  Col_3  Col_4  Col_5
  A      B      NaN    NaN    NaN
  A      C      D      NaN    NaN
  A      B      C      D      E
  B      D      NaN    NaN    NaN

我的目标是得到类似这样的结果:

Col_1  Col_2  Col_3  Col_4  Col_5  ConCat
  A      B      NaN    NaN    NaN    A:B
  A      C      D      NaN    NaN    A:C:D
  A      B      C      D      E      A:B:C:D:E
  B      D      NaN    NaN    NaN    B:D

我已经成功创建了一个看起来像期望输出的数据框,来自于:

rows = df.values
df_1 = pd.DataFrame([':'.join(word for word in rows if word is not np.nan) for rows in rows])

    0
0  A:B
1  A:C:D
2  A:B:C:D:E
3  B:D

但是现在当我尝试把它放回原来的数据框时,我遇到了:

df['concatenated'] = df_1

Col_1  Col_2  Col_3  Col_4  Col_5  concatenated
  A      B      NaN    NaN    NaN    NaN
  A      C      D      NaN    NaN    NaN
  A      B      C      D      E      NaN
  B      D      NaN    NaN    NaN    NaN

奇怪的是,当我创建一个简化的例子时,它按预期工作。下面是我正在做的完整代码。原始数据是从上面那个数据框转置过来的。

df_caregiver_type = pd.concat([df_caregiver_type[col].order().reset_index(drop=True) for col in df_caregiver_type], axis=1, ignore_index=False).T
df_caregiver_type.rename(columns=lambda x: 'Col_' + str(x), inplace=True)
rows = df_caregiver_type.values
df_caregiver_type1 = pd.DataFrame([':'.join(word for word in rows if word is not np.nan) for rows in rows])
df_caregiver_type['concatenated'] = df_caregiver_type1
df_caregiver_type = df_caregiver_type.T
df_caregiver_type

更新 我觉得我遇到错误是因为完整代码的第一行。这是一个单独但相关的问题: pandas:单独对每一列进行排序

3 个回答

0
>>> df = df.join(df_1)
>>> df = df.rename(columns = {0:'concatenated'})

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

1
>>> d = {'Col_1' : pd.Series(['A', 'A', 'A', 'B']),
...      'Col_2' : pd.Series(['B', 'C', 'B', 'D']),
...      'Col_3' : pd.Series([np.nan, 'D', 'C', np.nan]),
...      'Col_4' : pd.Series([np.nan, np.nan, 'D', np.nan]),
...      'Col_5' : pd.Series([np.nan, np.nan, 'E', np.nan]),}
>>> df = pd.DataFrame(d)
>>> 
>>> rows = df.values
>>> df_1 = pd.DataFrame([':'.join(word for word in rows if word is not np.nan) for rows in rows])
>>> 
>>> df['concatenated'] = df_1[0]
>>> df
  Col_1 Col_2 Col_3 Col_4 Col_5 concatenated
0     A     B   NaN   NaN   NaN          A:B
1     A     C     D   NaN   NaN        A:C:D
2     A     B     C     D     E    A:B:C:D:E
3     B     D   NaN   NaN   NaN          B:D
>>> 

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

29

对于你的完整数据集,把最后一步从 df['concatenated'] = df_1 改成 df['concatenated'] = df_1.values 这样就能解决问题。我觉得这可能是个小错误,我很确定我之前在StackOverflow上见过类似的情况。

或者你可以直接使用: df['concatenated'] = [':'.join(word for word in row if word is not np.nan) for row in rows]

撰写回答