您好,我目前有一个函数,可以在由新行分隔的同一单元格中拆分值。但是,下面的函数只允许我一次通过一列,这是在考虑是否还有其他方法可以使它通过多列或实际上是整个数据帧。
一个样本就是这样
A B C
1\n2\n3 2\n\5 A
代码在下面
def tidy_split(df, column, sep='|', keep=False):
indexes = list()
new_values = list()
df = df.dropna(subset=[column])
for i, presplit in enumerate(df[column].astype(str)):
values = presplit.split(sep)
if keep and len(values) > 1:
indexes.append(i)
new_values.append(presplit)
for value in values:
indexes.append(i)
new_values.append(value)
new_df = df.iloc[indexes, :].copy()
new_df[column] = new_values
return new_df
我运行时当前有效
df1 = tidy_split(df, 'A', '\n')
运行仅选择列A的功能
A B C
1 2\n5 A
2 2\n5 A
3 2\n5 A
我希望能够传递的不仅仅是接受的参数,而且在这种情况下,还可以拆分列“ B”。以前,我曾尝试传递lambda或尝试使用apply,但是它需要一个位置参数,即“ column”。将不胜感激!在考虑是否可能发生循环
编辑:期望的输出,因为每个数字都表示重要的内容 之前
A B C
1\n2\n3 2\n5 A
之后
A B C
1 2 A
2 5 A
3 n/a A
答案 0 :(得分:1)
输入:
A B C
0 1\n2\n3 2\n5 A
代码:
import pandas as pd
cols = df.columns.tolist()
# create list in each cell by detecting '\n'
for col in cols:
df[col] = df[col].apply(lambda x: str(x).split("\n"))
# empty dataframe to store result
dfs = pd.DataFrame()
# loop over rows to construct small dataframes
# and then accumulate each to the resulting dataframe
for ind, row in df.iterrows():
a_vals = row['A']
b_vals = row['B'] + ["n/a"] * (len(a_vals) - len(row['B']))
c_vals = row['C'] + [row['C'][0]] * (len(a_vals) - len(row['C']))
temp = pd.DataFrame({'A': a_vals, 'B': b_vals, 'C': c_vals})
dfs = pd.concat([dfs, temp], axis=0, ignore_index=True)
输出:
A B C
0 1 2 A
1 2 5 A
2 3 n/a A