[英]Fill NAN values of a column in dataframe from other dataframe pandas
[英]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.