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],但这会将所有内容放在同一列中,我希望类型和状态都是它们自己的列。请更新您的问题并描述您需要的内容,好吗?我不太明白。理想情况下,将示例数据以及结果应该是什么样子放在那里。完成后请在评论中告诉我,这样我就不会错过了。我宁愿在把数据喂大熊猫之前准备好数据。熊猫有一个不同的目的,不同于对单个行的操作。行上的迭代是无效的。