簡體   English   中英

從索引中拆分列的字符串值並在 Pandas DataFrame 中填充 NaN

[英]Spliting strings values of a column out of index and fill with NaN in a Pandas DataFrame

我有這樣的 DataFrame:

ROW_A    ROW_B
1        tata+toto
2        tata+toto
3        tata+toto
4        ti+tu+te
5        ti+tu+te
6        ti+tu+te
7        ti+tu+te

我想在新行中拆分 ROW_B 值。 我知道值的長度與索引的長度不匹配,但我只想拆分值並用 NaN 填充最后一個值,如下所示:

ROW_A    ROW_B       ROW_C
1        tata+toto   tata
2        tata+toto   toto
3        tata+toto   NaN
4        ti+tu+te    ti
5        ti+tu+te    tu
6        ti+tu+te    te
7        ti+tu+te    NaN

我試過這段代碼:

df_columns = df.columns
row_b = df_columns[1]

df['ROW_C'] = df.groupby('ROW_A')[row_b].transform(lambda x:x.head(1).str.split('+').explode().values)).fillna

這是錯誤消息:

ValueError: Length of values (2) does not match length of index (3)

一種選擇是drop_duplicates + str.split + explode來創建一個臨時系列。 然后用df.index重新索引它以獲得 NaN:

tmp = df['ROW_B'].drop_duplicates().str.split('+').explode()
df['ROW_C'] = tmp.set_axis(tmp.groupby(level=0).cumcount().pipe(lambda x: x+x.index), axis=0).reindex(df.index)

另一種選擇是使用groupby + cumcount創建組號,然后使用組號為每行中的列表編制索引。 由於組號超過列表長度,所以用try-except包起來:

out = []
for i, lst in zip(df.groupby('ROW_B').cumcount(), df['ROW_B'].str.split('+')):
    try:
        out.append(lst[i])
    except IndexError:
        out.append(float('nan'))

Output:

   ROW_A      ROW_B ROW_C
0      1  tata+toto  tata
1      2  tata+toto  toto
2      3  tata+toto   NaN
3      4   ti+tu+te    ti
4      5   ti+tu+te    tu
5      6   ti+tu+te    te
6      7   ti+tu+te   NaN

您可以按列ROW_B ,然后在每個組上創建一個新列 -

from itertools import zip_longest

recons_df = []
for k, g in df.groupby('ROW_B'):
    g.loc[:, 'ROW_C'] = list(x if x else y for (x, y) in zip_longest(k.split('+'), [np.nan]*g.index.size))
    recons_df.append(g)

recons_df = pd.concat(recons_df)
print(recons_df)
#   ROW_A      ROW_B ROW_C
#0      1  tata+toto  tata
#1      2  tata+toto  toto
#2      3  tata+toto   NaN
#3      4   ti+tu+te    ti
#4      5   ti+tu+te    tu
#5      6   ti+tu+te    te
#6      7   ti+tu+te   NaN

如果您不關心每個丟失的拆分的NaN ,請使用 -

df.merge(df['ROW_B'].str.split('+', expand=True).stack().reset_index(), left_on=[df.index], right_on=['level_0']).drop(['level_0', 'level_1'], axis=1).rename({0: 'ROW_C'}, axis=1)

Output

    ROW_A      ROW_B ROW_C
0       1  tata+toto  tata
1       1  tata+toto  toto
2       2  tata+toto  tata
3       2  tata+toto  toto
4       3  tata+toto  tata
5       3  tata+toto  toto
6       4   ti+tu+te    ti
7       4   ti+tu+te    tu
8       4   ti+tu+te    te
9       5   ti+tu+te    ti
10      5   ti+tu+te    tu
11      5   ti+tu+te    te
12      6   ti+tu+te    ti
13      6   ti+tu+te    tu
14      6   ti+tu+te    te
15      7   ti+tu+te    ti
16      7   ti+tu+te    tu
17      7   ti+tu+te    te

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM