Python复制数据帧中的行
如果数据帧看起来像:Python复制数据帧中的行,python,pandas,dataframe,Python,Pandas,Dataframe,如果数据帧看起来像: Store,Dept,Date,Weekly_Sales,IsHoliday 1,1,2010-02-05,24924.5,FALSE 1,1,2010-02-12,46039.49,TRUE 1,1,2010-02-19,41595.55,FALSE 1,1,2010-02-26,19403.54,FALSE 1,1,2010-03-05,21827.9,FALSE 1,1,2010-03-12,21043.39,FALSE 1,1,2010-03-19,22136.64
Store,Dept,Date,Weekly_Sales,IsHoliday
1,1,2010-02-05,24924.5,FALSE
1,1,2010-02-12,46039.49,TRUE
1,1,2010-02-19,41595.55,FALSE
1,1,2010-02-26,19403.54,FALSE
1,1,2010-03-05,21827.9,FALSE
1,1,2010-03-12,21043.39,FALSE
1,1,2010-03-19,22136.64,FALSE
1,1,2010-03-26,26229.21,FALSE
1,1,2010-04-02,57258.43,FALSE
我想复制IsHoliday
等于TRUE的行,我可以:
is_hol = df['IsHoliday'] == True
df_try = df[is_hol]
df=df.append(df_try*10)
但是有没有更好的方法可以做到这一点,因为我需要复制假日行5次,如果使用上述方法,我必须追加5次。您可以将
df\u try
放入列表中,然后按照您的想法执行:
df = df_try
for i in range(4):
df = df.append(df_try)
# Here, we have df_try times 5
df = df.append(df)
# Here, we have df_try times 10
>>> df.append([df_try]*5,ignore_index=True)
Store Dept Date Weekly_Sales IsHoliday
0 1 1 2010-02-05 24924.50 False
1 1 1 2010-02-12 46039.49 True
2 1 1 2010-02-19 41595.55 False
3 1 1 2010-02-26 19403.54 False
4 1 1 2010-03-05 21827.90 False
5 1 1 2010-03-12 21043.39 False
6 1 1 2010-03-19 22136.64 False
7 1 1 2010-03-26 26229.21 False
8 1 1 2010-04-02 57258.43 False
9 1 1 2010-02-12 46039.49 True
10 1 1 2010-02-12 46039.49 True
11 1 1 2010-02-12 46039.49 True
12 1 1 2010-02-12 46039.49 True
13 1 1 2010-02-12 46039.49 True
另一种方法是使用concat()函数:
import pandas as pd
In [603]: df = pd.DataFrame({'col1':list("abc"),'col2':range(3)},index = range(3))
In [604]: df
Out[604]:
col1 col2
0 a 0
1 b 1
2 c 2
In [605]: pd.concat([df]*3, ignore_index=True) # Ignores the index
Out[605]:
col1 col2
0 a 0
1 b 1
2 c 2
3 a 0
4 b 1
5 c 2
6 a 0
7 b 1
8 c 2
In [606]: pd.concat([df]*3)
Out[606]:
col1 col2
0 a 0
1 b 1
2 c 2
0 a 0
1 b 1
2 c 2
0 a 0
1 b 1
2 c 2
这是一个老问题,但由于它仍然出现在我在谷歌搜索结果的顶部,这里有另一种方法
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':list("abc"),'col2':range(3)},index = range(3))
假设要复制col1=“b”所在的行
您可以使用另一个函数替换列表解释中的
3 if val==“b”else 1
,如果val==“b”则返回3,如果val==“c”则返回4,依此类推,因此它非常灵活。附加和连接通常速度较慢,因此我建议只创建一个新的行列表并将其转换为数据帧(除非附加一行或连接几个数据帧)
将熊猫作为pd导入
df=pd.DataFrame([
[1,1,'2010-02-05',24924.5,假],
[1,1,'2010-02-12',46039.49,正确],
[1,1,'2010-02-19',41595.55,假],
[1,1,'2010-02-26',19403.54,假],
[1,1,'2010-03-05',21827.9,假],
[1,1,'2010-03-12',21043.39,假],
[1,1,'2010-03-19',22136.64,假],
[1,1,'2010-03-26',26229.21,假],
[1,1,'2010-04-02',57258.43,假]
],列=[“商店”、“部门”、“日期”、“每周销售额”、“iSoliday]”)
温度_df=[]
对于df.itertuples(index=False)中的行:
如果row.IsHoliday:
扩展温度([列表(行)]*5)
其他:
临时附录(列表(行))
df=pd.DataFrame(temp_-df,columns=df.columns)
这也将复制索引值,对吗?我不知道我是否做错了,但这对我来说非常慢。与使用.append(..)相比,这种更优雅的方法对我来说也非常快.我的用例只是用一行1000倍的时间复制一个数据帧。对于记录来说,进行外部连接可能更快,但代码会变得非常复杂,从而获得很小的增益。
reps = [3 if val=="b" else 1 for val in df.col1]
df.loc[np.repeat(df.index.values, reps)]