如何将值连接到字符串集?

时间:2019-02-08 15:08:44

标签: python pandas dataframe

假设我有一个看起来像这样的数据框:

REFERENCE_CODE   DUMMY_DATA
dog              foo
cat              fi
fish             fo
bird             fum
1                u
2                v
3                x
4                y

我的目标是创建一个数据框,该数据框将变为:

REFERENCE_CODE  DUMMY_DATA
dog             foo
cat             fi
fish            fo
bird            fum
dog_1           u
dog_2           v
dog_3           x
dog_4           y
cat_1           u
cat_2           v
cat_3           x 
cat_4           y
fish_1          u
fish_2          v
fish_3          x
fish_4          y
bird_1          u
bird_2          v
bird_3          x
bird_4          y

我能够到达:

REFERENCE_CODE  DUMMY_DATA
dog             foo
cat             fi
fish            fo
bird            fum
bird_1          u
bird_2          v
bird_3          x
bird_4          y

通过使用以下代码:

df.REFERENCE_CODE = df.REFERENCE_CODE.fillna('')
df['REFERENCE_CODE'] = df['REFERENCE_CODE'].apply(lambda x: str(x))
headers = (df.REFERENCE_CODE != '') & ~df['REFERENCE_CODE'].fillna('').str.isnumeric()
res = df.groupby(headers.cumsum())['REFERENCE_CODE'].apply(lambda x: x.iloc[0] + '_' + x)
df.REFERENCE_CODE.update(res[df.REFERENCE_CODE.str.isnumeric()])

如何使它应用于所有其他列并扩展数据框,而又不丢失其他列的完整性。

2 个答案:

答案 0 :(得分:0)

想法是对过滤后的非数字REFERENCE_CODE列和过滤后的具有数值行的列使用交叉连接:

#simplify code
df['REFERENCE_CODE'] = df.REFERENCE_CODE.fillna('').astype(str)
mask = (df.REFERENCE_CODE != '') & ~df['REFERENCE_CODE'].str.isnumeric()

#filter by condition for matched and not matched rows
df1 = df[mask]
df2 = df[~mask]

#cross join
df = df1[['REFERENCE_CODE']].assign(A=1).merge(df2.assign(A=1), on='A')
#join columns together
df['REFERENCE_CODE'] = df['REFERENCE_CODE_x'] + '_' + df['REFERENCE_CODE_y']

#concat new DataFrame with first filtered
df = pd.concat([df1, df[['REFERENCE_CODE','DUMMY_DATA']]], ignore_index=True)

print (df)
   REFERENCE_CODE DUMMY_DATA
0             dog        foo
1             cat         fi
2            fish         fo
3            bird        fum
4           dog_1          u
5           dog_2          v
6           dog_3          x
7           dog_4          y
8           cat_1          u
9           cat_2          v
10          cat_3          x
11          cat_4          y
12         fish_1          u
13         fish_2          v
14         fish_3          x
15         fish_4          y
16         bird_1          u
17         bird_2          v
18         bird_3          x
19         bird_4          y

答案 1 :(得分:0)

您可以首先将数据帧切成必要的值以生成输出的扩展部分:

m = 4
codes = df.REFERENCE_CODE.iloc[:m]
dum = df.DUMMY_DATA.iloc[m:].values

按列表理解顺序使用字符串格式来生成一个列表,其中包含REFERENCE_CODE中的新值:

x = [[f'{i+1}_{j}', dum[i]] for j in codes for i in range(m)]
new = pd.DataFrame(x, columns=df.columns)

然后将新数据框.append用于df

df.iloc[:m].append(new)

    REFERENCE_CODE DUMMY_DATA
0             dog        foo
1             cat         fi
2            fish         fo
3            bird        fum
4           1_dog          u
5           2_dog          v
6           3_dog          x
7           4_dog          y
8           1_cat          u
9           2_cat          v
10          3_cat          x
11          4_cat          y
12         1_fish          u
13         2_fish          v
14         3_fish          x
15         4_fish          y
16         1_bird          u
17         2_bird          v
18         3_bird          x
19         4_bird          y