【问题标题】:Create pandas DataFrame with 3 text files使用 3 个文本文件创建 pandas DataFrame
【发布时间】:2018-01-31 15:47:57
【问题描述】:

这是我的情况:我有 3 个来自 Matlab 的矩阵 (X,Y,Z),大小为 (126,321) X 是 x 坐标,Y 是 y 坐标,Z 是机器的效率取决于坐标 X 和 Y . 我想在 python 中使用矩阵 Z。所以我将 Z 保存在一个文本文件中。但是在我转置它并将它旋转90°之前(因为Matlab中的矩阵与图中的表示不同)。 然后我将带有 x 坐标的向量保存在文本文件中 我将带有 y 坐标的向量保存在文本文件中。

所以我有 3 个文本文件: - 大小为 (126,321) 的 text1.txt(它是 Z) - text2.txt 这是一行有 126 个值 - text3.txt 是一行有 321 个值的行

我想做的是创建一个带有熊猫的 DataFrame,其中 text1 是数据,text 2 是索引,text3 是标题。

我做了以下代码:

Efficiency=pd.read_csv('text1.txt',sep=';',header=None,index_col=False)
x=pd.read_csv('text3.txt',sep=';',header=None,index_col=False)
y=pd.read_csv('text2.txt',sep=';',header=None,index_col=False)
Efficiency.columns=x
Efficiency.index=y

但最后两行不起作用。 我试图通过 numpy 但结果也不好。

所以如果您有任何解释或解决方案,请告诉我!

非常感谢。

【问题讨论】:

标签: python matlab pandas numpy dataframe


【解决方案1】:
df1=pd.DataFrame(np.random.randint(0,100,126))

df2=pd.DataFrame(np.random.randint(322,1000,321))#The problem is that at least two columnn names are equal and thus it throws an error

您可以使用它来调查重复值。这对你来说应该是一样的

duplicates=df2.duplicated()
print(df2[duplicates])

     0
22   828
30   575
41   341
55   713
75   341
80   353
92   759
117  520
118  330
126  828
130  547
134  927
142  451
150  778
155  417

....

因为删除值和更改值不是您的选择,一种方便的方法是使用多索引,其中您的 x 值位于第一级,第二级是从 0 到列数的数字。

mcols=pd.MultiIndex.from_arrays([np.random.randint(322,1000,321),np.linspace(0,320,321)])

df3=pd.DataFrame(np.random.randint(0,100,size=(126,321)))# This ranom numbers should simulate your (126,321) DataFrame


df4=pd.DataFrame(df3.values,index=df1,columns=mcols)
print(df4)

.....

 868   679   757   464   420   381   843   549   978   450  ...    578  \
   0.0   1.0   2.0   3.0   4.0   5.0   6.0   7.0   8.0   9.0    ...  311.0   
47     7    73    78    98    41    62    48    65    35    26  ...     85   
68    54    40    61    75    24     9    15    25     1    35  ...     63   
89    44    30    48    95    27    11    52    41    87    31  ...     73   
57    61    46    11    88    21    58    80    42    99    65  ...     23   
37    70    88    32    95    46    66    93    37    88    95  ...     64   
38    14    19    63    73     0    53    71     4    20    63  ...     88   
60    71    87    18    30    94    30    32     9    32    82  ...     36   
15    87     8    57    68    24    95    26    47    29    29  ...      5   
77    70    54    82    31    85    27    13    13    66    16  ...      3   
10     1    28    64     2    75    22    20     9    93     0  ...     89   
60    26    62    81    13     8    18    40    15    13    47  ...     44   
35    24    42    16    68    45    73    96    81     3    44  ...     16   
81    63    30    19    81    99    81     9     9    34    37  ...     53   

.....

参考Shihe Zhang,您可以直接设置索引和列名,无需重新索引,也无需使用多重索引:

df4=pd.DataFrame(df3.values,index=df1.iloc[:,0],columns=df2.iloc[:,0])

【讨论】:

  • 我做到了,但收到消息错误:缓冲区的维数错误(预期1,得到2)
  • 我最后使用了以下代码:df4=pd.DataFrame(df3,index=df1.loc[:,0],columns=df2.loc[:,0]) 并且它有效。谢谢!
  • @Nathan 可能你遇到了类似stackoverflow.com/q/27065133/1278112 的问题,而那是另一个问题。
  • Thjs 可以通过为每个列名设置后缀来防止,以防您想要合并两个数据框并且其中一个具有重复的列名。这可以通过例如df.columns=[df.columns[i]+str(i) for i in range(len(df.columns))] 来完成,其中每个列肯定有另一个名称,但在这种情况下这不是一个选项,因为不允许更改列的值。但正如你所说,这是另一个问题
【解决方案2】:

你需要做的是将一行 x 和一行 y 变成一个索引。 要更改索引,请reindex它。

Efficiency.reindex(index=x.iloc[0], columns=y.iloc[0])

注意:

除非新索引等同于 当前一个和copy=False

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2019-05-05
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多