你好我的问题几乎和这篇帖子一样:How to fill in a column with column names whose rows are not NULL in Pandas?
但在我的例子中,我需要根据列名是国家还是细分来填充列,而不是进行串联。
编辑:表x1c 0d1x原来我有这个:
| 区段|国家/地区|第1段|国家1|第2部分|
| - -|- -|- -|- -|- -|
| 南|南|小行星123456|小行星123456|南|
| 南|南|南|南|南|
| 南|南|南|小行星123456|小行星123456|
| 南|南|南|小行星123456|小行星123456|
实际上,我有这样的代码(在我的代码中,前两列由最后一行之前的两行填充:
| 区段|国家/地区|第1段|国家1|第2部分|
| - -|- -|- -|- -|- -|
| 部门1;国家/地区1;|部门1;国家/地区1;|小行星123456|小行星123456|南|
| 南|南|南|南|南|
| 国家1;地区2;|国家1;地区2;|南|小行星123456|小行星123456|
| 国家1;地区2;|国家1;地区2;|南|小行星123456|小行星123456|
我需要这个
| 区段|国家/地区|第1段|国家1|第2部分|
| - -|- -|- -|- -|- -|
| 第1段|国家1|小行星123456|小行星123456|南|
| 南|南|南|南|南|
| 第2部分|国家1|南|小行星123456|小行星123456|
| 第2部分|国家1|南|小行星123456|小行星123456|
**编辑:我的代码实际上看起来像尝试集成后的anwser:**错误是:AttributeError: Can only use .str accessor with string values!. Did you mean: 'std'?
#For each column in df, check if there is a value and if yes : first copy the value into the 'Amount' Column, then copy the column name into the 'Segment' or 'Country' columns
for column in df.columns[3:]:
valueList = df[column][3:].values
valueList = valueList[~pd.isna(valueList)]
def detect(d):
cols = d.columns.values
dd = pd.DataFrame(columns=cols, index=d.index.unique())
for col in cols:
s = d[col].loc[d[col].str.contains(col[0:3], case=False)].str.replace(r'(\w+)(\d+)', col + r'\2')
dd[col] = s
return dd
#Fill amount Column with other columns values if NaN
if column in isSP:
df['Amount'].fillna(df[column], inplace = True)
df['Segment'] = df.iloc[:, 3:].notna().dot(df.columns[3:] + ';' ).str.strip(';')
df['Country'] = df.iloc[:, 3:].notna().dot(df.columns[3:] + ' ; ' ).str.strip(';')
df[['Segment', 'Country']] = detect(df[['Segment', 'Country']].apply(lambda x: x.astype(str).str.split(r'\s+[+]\s+').explode()))
非常感谢您的光临。
1条答案
按热度按时间46qrfjad1#
给定:
正在执行
输出量:
重Regex版本: