Python 如何将单个列中的数据拆分为新行(新行中的其他列保持相同)

Python 如何将单个列中的数据拆分为新行(新行中的其他列保持相同),python,pandas,Python,Pandas,我有一个关于枪支暴力的数据集。其中一列包括参与者类型,受害者或受试者/嫌疑人。对于事件中的每个参与者,参与者列中有多个值 import pandas as pd data = pd.read_csv('Gun violence Shortened version.csv') data.head() 输出: incident_id date state participant_type 0 461105 1/1/2013 Pennsylvania 0:

我有一个关于枪支暴力的数据集。其中一列包括参与者类型,受害者或受试者/嫌疑人。对于事件中的每个参与者,参与者列中有多个值

import pandas as pd
data = pd.read_csv('Gun violence Shortened version.csv')
data.head()
输出:

 incident_id    date    state   participant_type    
0   461105  1/1/2013    Pennsylvania    0::Victim||1::Victim||2::Victim||3::Victim||4:...   
1   460726  1/1/2013    California  0::Victim||1::Victim||2::Victim||3::Victim||4:...   
2   478855  1/1/2013    Ohio    0::Subject-Suspect||1::Subject-Suspect||2::Vic...   
3   478925  1/5/2013    Colorado    0::Victim||1::Victim||2::Victim||3::Subject-Su...   
4   478959  1/7/2013    North Carolina  0::Victim||1::Victim||2::Victim||3::Subject-Su...   
我想让每个参与者都有自己的行,同时保持事件id和日期不变:

incident_id date    state   participant_type    
0   461105  1/1/2013    Pennsylvania    Victim
1   461105  1/1/2013    Pennsylvania    Victim
2   461105  1/1/2013    Pennsylvania    Victim
3   461105  1/1/2013    Pennsylvania    Subject-Suspect *this was the 4:: instance that was cut off earlier*

我不知道如何做到这一点。我看到过将一列拆分为两列的示例,但没有看到如何将一列拆分为一行。

我宁愿使用常规Python的数据结构提前准备数据,然后从中创建一个数据帧。原因是,熊猫主要不是为像单独的行操作这样的操作而设计的,尽管有办法做到这一点,但它的速度要慢得多

下面的代码使用Python标准库中的将CSV数据解析为常规列表,同时为最后一列中包含多个项目的每个CSV行添加多行。在最后一步中,只需从预处理列表中创建Pandas
DataFrame

import pandas as pd
import csv

data = []
with open('Gun violence Shortened versio.csv') as file:
    reader = csv.reader(file, delimiter=',')

    # iterate over all rows in the CSV
    for row in reader:
        # split the content of the last column by the || delimiter into a list
        # if there's no delimiter, it will produce a single-item list
        items = row[3].split('||')

        # append each item from the last column together with other columns
        # as an individual row to the data list, N items will produce N rows
        for item in items:
            data.append([row[0], row[1], row[2], item])

df = pd.DataFrame(data)
这不是最终的解决方案,您需要跳过第一行,从最后一列中清除各个项目,等等,但这应该很简单


还有,在Pandas中对行的操作比使用Python的数据结构准备数据并从中创建
DatFrame
要慢1000倍左右。

下面是获得输出的另一个脚本,尽管Dawid共享的解决方案看起来更快

import pandas as pd
import numpy as np


if __name__ == '__main__':
    df_new = pd.DataFrame()
    pd.set_option('display.width', 100000)
    pd.set_option('display.max_columns', 500)
    dict = {'col1':[461105,460726]
            ,'col2':['0::Victim||1::Victim||2::Victim||3::Victim||4:Subject-Suspect','0::Victim||1::Victim||2::Victim||3::Victim||4:Subject-Suspect']}
    df = pd.DataFrame(dict)
    #print(df)
    col1_list=[]
    col2_list = []
    for index,row in df.iterrows():
        for rec in row.col2.split('||'):
            col1_list.append(row.col1)
            col2_list.append(rec.split(':')[-1])
    dict_new = {'col1':col1_list,'col2':col2_list}
    df_new= pd.DataFrame(dict_new)
    #df.append(df_new,ignore_index=True)
    print(df_new)

欢迎来到堆栈溢出。请先检查堆栈溢出。请关注、和。感谢您接受我的回答。如果你能投上一票,我也会很感激,以防这对你有所帮助,作为我在答案上投入时间的补偿。提前感谢。需要在解决方案中添加-item.split(“:”)[-1]以清除其中不需要的数据。当然,这是我在最后一句中提到的事情之一。我想帮助OP,而不是为他写代码。谢谢你的这个解决方案,它非常有用!我一直在尝试对我想做同样事情的多个专栏(参与者的状态、参与者的年龄等)进行一些调整,这是怎么回事?我试图写items_type=row[3]。split(“| |”)items_status=row[4]。split(“| |”)items=[items_type,items_status],但这会将所有内容放在同一列中,我希望类型和状态都是它们自己的列。请更新您的问题并描述您需要的内容,好吗?我不太明白。理想情况下,将示例数据以及结果应该是什么样子放在那里。完成后请在评论中告诉我,这样我就不会错过了。我宁愿在把数据喂大熊猫之前准备好数据。熊猫有一个不同的目的,不同于对单个行的操作。行上的迭代是无效的。