Python 那里';这是一种从字符串拆分创建行的方法

Python 那里';这是一种从字符串拆分创建行的方法,python,pandas,Python,Pandas,我需要你的帮助,比如: 我的输入(当我读取.csv文件时): df=pd.DataFrame(数据) 我的期望输出: 我不知道怎么解释得比这更好 我感谢你的帮助 谢谢 data = {'A':['000','001','002','003'], 'B':['Name0','Name1','Name2','Name3'], 'C':[27,24,35,68], 'D':['@DI','@DI','@DI','@DI']} 这似乎是一项体力劳动,而不是技术劳动:) entry

我需要你的帮助,比如:

我的输入(当我读取.csv文件时):

df=pd.DataFrame(数据)

我的期望输出:

我不知道怎么解释得比这更好

我感谢你的帮助

谢谢

data = {'A':['000','001','002','003'],
   'B':['Name0','Name1','Name2','Name3'],
   'C':[27,24,35,68],
   'D':['@DI','@DI','@DI','@DI']}

这似乎是一项体力劳动,而不是技术劳动:)

entry_list=df.loc[2,'B'].split(“”)
df.loc[2,'B']=条目列表[0]
条目列表=条目列表[3:]
行=[]
对于范围内的i(0,len(条目列表),4):
原始行=条目列表[i:i+4]
行=[item.replace('@','')用于原始行[:-1]中的项]
行。追加(原始行[-1])
行。追加(行)
df=pd.concat([df,pd.DataFrame(line,columns=df.columns)])。重置索引(drop=True)

您可以基于“@”拆分字符串。然后您需要对它们进行分组(split函数将完成此操作)。最后,更改所需列的值并使用pd.explode获得结果

如果这是你需要的,我可以详细解释

df['split'] = df['B'].str.split('@')
def split(id,x):
    if len(x) <= 1:
        return np.NaN
    a_list = [id]
    b_list = []
    c_list = []
    d_list = []
    for index,i in enumerate(x):
        if index % 4 == 0:
            b_list.append(i)
        elif (index+1)%4 == 0:
            a_list.append(i)
        elif (index+2) % 4 ==0:
            i = '@' + str(i)
            d_list.append(i)
        else:
            c_list.append(i)
    return [a_list,b_list,c_list,d_list]
            
        
df['split'] = df.apply(lambda x: split(x['A'],x['split']), axis=1)

# df[]=df['split'].str[1]
df.loc[(~df['split'].isnull()), 'A'] = df.loc[(~df['split'].isnull()), 'split'].str[0]
df.loc[(~df['split'].isnull()), 'B'] = df.loc[(~df['split'].isnull()), 'split'].str[1]
df.loc[(~df['split'].isnull()), 'C'] = df.loc[(~df['split'].isnull()), 'split'].str[2]
df.loc[(~df['split'].isnull()), 'D'] = df.loc[(~df['split'].isnull()), 'split'].str[3]
df = df.drop('split', axis=1)
df = df.apply(pd.Series.explode)

现在还不清楚你想做什么,不要发布图片,发布复制粘贴友好的表格。理想情况下,您应该发布创建该数据帧所需的代码,以便人们可以在本地创建它。您将有更多的机会获得帮助。感谢您的帮助,添加了数据帧编码。它工作良好,我需要它。谢谢你的回答!这也是一个很好的答案。谢谢你的帮助!它适用于遵循相同模式的任意数量的行。:)
df['split'] = df['B'].str.split('@')
def split(id,x):
    if len(x) <= 1:
        return np.NaN
    a_list = [id]
    b_list = []
    c_list = []
    d_list = []
    for index,i in enumerate(x):
        if index % 4 == 0:
            b_list.append(i)
        elif (index+1)%4 == 0:
            a_list.append(i)
        elif (index+2) % 4 ==0:
            i = '@' + str(i)
            d_list.append(i)
        else:
            c_list.append(i)
    return [a_list,b_list,c_list,d_list]
            
        
df['split'] = df.apply(lambda x: split(x['A'],x['split']), axis=1)

# df[]=df['split'].str[1]
df.loc[(~df['split'].isnull()), 'A'] = df.loc[(~df['split'].isnull()), 'split'].str[0]
df.loc[(~df['split'].isnull()), 'B'] = df.loc[(~df['split'].isnull()), 'split'].str[1]
df.loc[(~df['split'].isnull()), 'C'] = df.loc[(~df['split'].isnull()), 'split'].str[2]
df.loc[(~df['split'].isnull()), 'D'] = df.loc[(~df['split'].isnull()), 'split'].str[3]
df = df.drop('split', axis=1)
df = df.apply(pd.Series.explode)
      A       B    C     D
0   000   Name0   27   @DI
1   001   Name1   24   @DI
2   002  Name2   35   @DI 
2  003   Name3   68    @DI