在R中,您可以使用rbind将一个数据列粘贴到另一个数据列的底部,从而合并两个数据帧。 在大熊猫中,您如何完成同一件事? 看来异常困难。
由于我不了解的原因,使用append会导致混乱,包括NaN和其他内容。 我只是试图" rbind"两个看起来像这样的相同框架:
编辑:我正在以一种愚蠢的方式创建DataFrames,这会导致问题。 附加= rbind所有意图和目的。 请参阅下面的答案。
0 1 2 3 4 5 6 7
0 ADN.L 20130220 437.4 442.37 436.5000 441.9000 2775364 2013-02-20 18:47:42
1 ADM.L 20130220 1279.0 1300.00 1272.0000 1285.0000 967730 2013-02-20 18:47:42
2 AGK.L 20130220 1717.0 1749.00 1709.0000 1739.0000 834534 2013-02-20 18:47:43
3 AMEC.L 20130220 1030.0 1040.00 1024.0000 1035.0000 1972517 2013-02-20 18:47:43
4 AAL.L 20130220 1998.0 2014.50 1942.4999 1951.0000 3666033 2013-02-20 18:47:44
5 ANTO.L 20130220 1093.0 1097.00 1064.7899 1068.0000 2183931 2013-02-20 18:47:44
6 ARM.L 20130220 941.5 965.10 939.4250 951.5001 2994652 2013-02-20 18:47:45
但是我得到了一些可怕的东西:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
0 NaN NaN NaN NaN NaN NaN NaN NaN ADN.L 20130220 437.4 442.37 436.5000 441.9000 2775364 2013-02-20 18:47:42
1 NaN NaN NaN NaN NaN NaN NaN NaN ADM.L 20130220 1279.0 1300.00 1272.0000 1285.0000 967730 2013-02-20 18:47:42
2 NaN NaN NaN NaN NaN NaN NaN NaN AGK.L 20130220 1717.0 1749.00 1709.0000 1739.0000 834534 2013-02-20 18:47:43
3 NaN NaN NaN NaN NaN NaN NaN NaN AMEC.L 20130220 1030.0 1040.00 1024.0000 1035.0000 1972517 2013-02-20 18:47:43
4 NaN NaN NaN NaN NaN NaN NaN NaN AAL.L 20130220 1998.0 2014.50 1942.4999 1951.0000 3666033 2013-02-20 18:47:44
5 NaN NaN NaN NaN NaN NaN NaN NaN ANTO.L 20130220 1093.0 1097.00 1064.7899 1068.0000 2183931 2013-02-20 18:47:44
6 NaN NaN NaN NaN NaN NaN NaN NaN ARM.L 20130220 941.5 965.10 939.4250 951.5001 2994652 2013-02-20 18:47:45
0 NaN NaN NaN NaN NaN NaN NaN NaN ADN.L 20130220 437.4 442.37 436.5000 441.9000 2775364 2013-02-20 18:47:42
1 NaN NaN NaN NaN NaN NaN NaN NaN ADM.L 20130220 1279.0 1300.00 1272.0000 1285.0000 967730 2013-02-20 18:47:42
2 NaN NaN NaN NaN NaN NaN NaN NaN AGK.L 20130220 1717.0 1749.00 1709.0000 1739.0000 834534 2013-02-20 18:47:43
3 NaN NaN NaN NaN NaN NaN NaN NaN
而且我不明白为什么。 我开始想念R :(
在这里查看:pandas.pydata.org/pandas-docs/stable/merging.html
concat更像是rbind而不是append。 查看来自@Seth的评论
使用append进行专门的连接有一个简单的示例:df = pd.DataFrame([[1, 2], [3, 4]], columns=list(AB)) df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list(AB)) df.append(df2)
另请参见pandas数据框concat vs append:" append和concat [几乎]相等" ..." append是concat的特定情况(轴= 0,join =外部)"。
嗯,这与我创建DataFrame的方式有关,而不是与我将它们组合在一起的方式有关。它的长短是,如果要使用循环和如下所示的语句创建框架:
Frame = Frame.append(pandas.DataFrame(data = SomeNewLineOfData))
您必须忽略索引
Frame = Frame.append(pandas.DataFrame(data = SomeNewLineOfData), ignore_index=True)
否则以后合并数据时会有问题。
因此,在问了一个问题后再回顾一下,我认为值得注意的是-这是制作数据框的一种糟糕方法。 最好先构造一个字典列表,然后再调用构造函数。
或者,更好的是:不要在循环内调用df.append,这是二次复杂度。 而是将DataFrames追加到列表中,并在最后调用pd.concat。
这为我工作:
import numpy as np
import pandas as pd
dates = np.asarray(pd.date_range('1/1/2000', periods=8))
df1 = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
df2 = df1.copy()
df = df1.append(df2)
产量:
A B C D
2000-01-01 -0.327208 0.552500 0.862529 0.493109
2000-01-02 1.039844 -2.141089 -0.781609 1.307600
2000-01-03 -0.462831 0.066505 -1.698346 1.123174
2000-01-04 -0.321971 -0.544599 -0.486099 -0.283791
2000-01-05 0.693749 0.544329 -1.606851 0.527733
2000-01-06 -2.461177 -0.339378 -0.236275 0.155569
2000-01-07 -0.597156 0.904511 0.369865 0.862504
2000-01-08 -0.958300 -0.583621 -2.068273 0.539434
2000-01-01 -0.327208 0.552500 0.862529 0.493109
2000-01-02 1.039844 -2.141089 -0.781609 1.307600
2000-01-03 -0.462831 0.066505 -1.698346 1.123174
2000-01-04 -0.321971 -0.544599 -0.486099 -0.283791
2000-01-05 0.693749 0.544329 -1.606851 0.527733
2000-01-06 -2.461177 -0.339378 -0.236275 0.155569
2000-01-07 -0.597156 0.904511 0.369865 0.862504
2000-01-08 -0.958300 -0.583621 -2.068273 0.539434
如果您尚未使用最新版本的pandas,我强烈建议您进行升级。现在可以对包含重复索引的DataFrame进行操作。
点子不会产生最新的熊猫吗?
@ N.McA。 是的,应该。 您可以这样检查-pd.version.version。
pd.concat将用于R中的rbind。
import pandas as pd
df1 = pd.DataFrame({'col1': [1,2], 'col2':[3,4]})
df2 = pd.DataFrame({'col1': [5,6], 'col2':[7,8]})
print(df1)
print(df2)
print(pd.concat([df1, df2]))
结果将如下所示:
col1 col2
0 1 3
1 2 4
col1 col2
0 5 7
1 6 8
col1 col2
0 1 3
1 2 4
0 5 7
1 6 8
如果您足够仔细地阅读了文档,它还将说明其他操作,例如cbind,.. etc。
import pandas as pd
import numpy as np
如果您有一个像这样的DataFrame:
array = np.random.randint( 0,10, size = (2,4) )
df = pd.DataFrame(array, columns = ['A','B', 'C', 'D'], \
index = ['10aa', '20bb'] ) ### some crazy indexes
df
A B C D
10aa 4 2 4 6
20bb 5 1 0 2
并且您想要添加一些新行,它是一个列表(或另一个可迭代对象):
List = [i**3 for i in range(df.shape[1]) ]
List
[0, 1, 8, 27]
您应该使用zip()函数使用键等于DataFrame中的列将列表转换为字典:
Dict = dict( zip(df.columns, List) )
Dict
{'A': 0, 'B': 1, 'C': 8, 'D': 27}
比您可以使用append()方法添加新字典:
df = df.append(Dict, ignore_index=True)
df
A B C D
0 7 5 5 4
1 5 8 4 1
2 0 1 8 27
N.B.索引被删除。
是的,它不像R中的cbind()那样简单:(