numpy python pandas中的Tensor(5维矩阵)?

vawmfj5a  于 11个月前  发布在  Python
关注(0)|答案(1)|浏览(191)

我有一个CSV文件,
| 时间|Col_A| B列|C列|D列|价格|
| --|--|--|--|--|--|
| 123 |A1| B1| C2| D6|二十三点四十三分|
| 124 |A5| B3| C7| D1|十四点六十三分|
| 125 |A3| B2| C3| D2| 343.43|
| 126 |A2| B1| C2| D6|四十三点四十三|
| 127 |A1| B1| C7| D2| 6.63|
现在我想创建一个5维矩阵,我想它应该叫Tensor吧?
问题1)这个Tensor可以在Pandas中完成吗?或者有更好的Python库吗?你有API手册的链接吗?
Tensor的维度将是“time”、“Col_A”、“Col_B”、“Col_C”、“Col_D”。单元格将包含标量“Price”。
所以我希望能够设置单元格,可能是这样的:

my_matrix[time=123, Col_A = A1, Col_B = B1, Col_C = C2, Col_D = D6] = 23.43

字符串
问题2)那么设置标量的语法是什么?我如何读取标量?
我也想对维数求和,比如我想在下面这样求和,当我写“*”的时候,我的意思是星星是一个小的。

Matrix[time = *, Col_A = A1, Col_B = B1 and B2 and B3, Col_C = *, Col_D = D6 and D2]


问题3)如何对不同维度求和?是否需要for循环?是否可以使用其他操作,如除法?
实际上,我想在每个单元格里放几个数字。也许我想在每个单元格里放“time”和“Price”。我想的是字符串连接“time_Price”,但是要做一个大的求和,会有很多子串提取,这可能很耗时?因此,我在考虑创建几个相同的Tensor。一个Tensor可能包含每个单元格中的“价格”,另一个Tensor可能在每个单元格中包含“时间”。所以如果我想检查Price的时间,我将在两个Tensor中使用相同的坐标。
问题4)我想使用多个Tensor更快,每个单元包含一个值,而不是使用一个包含许多变量的Tensor,即连接变量的长字符串?或者有更好的方法吗?

sz81bmfz

sz81bmfz1#

看起来一个框架已经是一个适合你的数据的结构了。为了回答你的问题,我将使用你的示例数据,按Col_*列索引:

# set up df
df = pd.DataFrame({
    'time': [123, 124, 125, 126, 127],
    'Col_A': ['A1', 'A5', 'A3', 'A2', 'A1'],
    'Col_B': ['B1', 'B3', 'B2', 'B1', 'B1'],
    'Col_C': ['C2', 'C7', 'C3', 'C2', 'C7'],
    'Col_D': ['D6', 'D1', 'D2', 'D6', 'D2'],
    'Price': [23.43, 14.63, 343.43, 43.43, 6.63]
})

# set the index to the `Col_*` columns and sort for performance
df = df.set_index(['Col_A','Col_B','Col_C','Col_D']).sort_index()

字符串
现在我们有了一个嵌套框架,其中Col_*值是索引,timePrice值在“单元格”中。这基本上是问题1的答案。

time   Price
Col_A Col_B Col_C Col_D
A1    B1    C2    D6      123   23.43
            C7    D2      127    6.63
A2    B1    C2    D6      126   43.43
A3    B2    C3    D2      125  343.43
A5    B3    C7    D1      124   14.63


对于问题2,您可以使用索引来设置“单元格”值:

df.loc[('A1','B1','C2','D6'), 'Price'] = 55


或者同时使用两个“细胞”:

df.loc[('A1','B1','C7','D2'), ['time', 'Price']] = [100, 99]


或者有个条件:

df.loc[(df.index == ('A2','B1','C2','D6')) & (df['time'] == 126), 'Price'] = 44


输出量:

time   Price
Col_A Col_B Col_C Col_D
A1    B1    C2    D6      123   55.00
            C7    D2      100   99.00
A2    B1    C2    D6      126   44.00
A3    B2    C3    D2      125  343.43
A5    B3    C7    D1      124   14.63


对于问题3,使用索引来访问所需的值; slice(None)用于索引:

df.loc[('A1', ['B1','B2','B3'], slice(None), ['D2','D6'])].sum()


输出量:

time     223.0
Price    154.0
dtype: float64


在问题4中,您可以在框架中设置任意多个“单元格”值。如上所示,您可以根据需要单独或一起访问“单元格”值。例如,假设您想要地址和性别信息。然后您可以像这样设置其中的一些值:

# set an existing entry
df.loc[('A1','B1','C7','D2'), ['Address', 'Gender']] = ['1 Main St', 'male']

# create a new entry with all 4 values
# (time, price, address, gender)
df.loc[('A4', 'B4', 'C4', 'D4')] = [130, 45.3, 'High St', 'female']

# create a new entry with only 3 of the 4 values
df.loc[('A1', 'B2', 'C3', 'D4'), ['time', 'Price', 'Address']] = [120, 51.4, '4 Brown St']


从原始的矩阵开始,这给出:

time   Price     Address  Gender
A1 B1 C2 D6  123.0   23.43         NaN     NaN
      C7 D2  127.0    6.63   1 Main St    male
A2 B1 C2 D6  126.0   43.43         NaN     NaN
A3 B2 C3 D2  125.0  343.43         NaN     NaN
A5 B3 C7 D1  124.0   14.63         NaN     NaN
A4 B4 C4 D4  130.0   45.30     High St  female
A1 B2 C3 D4  120.0   51.40  4 Brown St     NaN


请注意,出于性能原因,您应该在添加新条目后使用df = df.sort_index()
您也可以轻松地搜索此框架。例如,查找所有具有Price > 50的行:

df[df['Price'] > 50]


输出量:

time   Price     Address Gender
A3 B2 C3 D2  125.0  343.43         NaN    NaN
A1 B2 C3 D4  120.0   51.40  4 Brown St    NaN


time < 125,未指定性别:

df[(df['time'] < 125) & df['Gender'].isna()]


输出量:

time  Price     Address Gender
A1 B1 C2 D6  123.0  23.43         NaN    NaN
A5 B3 C7 D1  124.0  14.63         NaN    NaN
A1 B2 C3 D4  120.0  51.40  4 Brown St    NaN

相关问题