multi_index_example/
multi_index_example.rs

1use pandrs::error::Result;
2use pandrs::{DataFrame, Index, MultiIndex};
3
4fn main() -> Result<()> {
5    println!("=== Example of Using MultiIndex ===\n");
6
7    // =========================================
8    // Creating a MultiIndex
9    // =========================================
10
11    println!("--- Creating MultiIndex from Tuples ---");
12
13    // Create MultiIndex from tuples (vector of vectors)
14    let tuples = vec![
15        vec!["A".to_string(), "a".to_string()],
16        vec!["A".to_string(), "b".to_string()],
17        vec!["B".to_string(), "a".to_string()],
18        vec!["B".to_string(), "b".to_string()],
19    ];
20
21    let names = Some(vec![Some("first".to_string()), Some("second".to_string())]);
22    let multi_idx = MultiIndex::from_tuples(tuples, names)?;
23
24    println!("MultiIndex: {:?}\n", multi_idx);
25    println!("Number of Levels: {}", multi_idx.n_levels());
26    println!("Number of Rows: {}\n", multi_idx.len());
27
28    // =========================================
29    // Operations on MultiIndex
30    // =========================================
31
32    println!("--- Retrieving Level Values ---");
33    let level0_values = multi_idx.get_level_values(0)?;
34    println!("Values in Level 0: {:?}", level0_values);
35
36    let level1_values = multi_idx.get_level_values(1)?;
37    println!("Values in Level 1: {:?}", level1_values);
38
39    println!("--- Swapping Levels ---");
40    let swapped = multi_idx.swaplevel(0, 1)?;
41    println!("After Swapping Levels: {:?}\n", swapped);
42
43    // =========================================
44    // DataFrame with MultiIndex
45    // =========================================
46
47    println!("--- DataFrame with MultiIndex ---");
48
49    // Create DataFrame
50    let mut df = DataFrame::with_multi_index(multi_idx.clone());
51
52    // Add data
53    let data = vec![
54        "data1".to_string(),
55        "data2".to_string(),
56        "data3".to_string(),
57        "data4".to_string(),
58    ];
59    df.add_column(
60        "data".to_string(),
61        pandrs::Series::new(data, Some("data".to_string()))?,
62    )?;
63
64    println!("DataFrame: {:?}\n", df);
65    println!("Number of Rows: {}", df.row_count());
66    println!("Number of Columns: {}", df.column_count());
67
68    // =========================================
69    // Conversion Between Simple Index and MultiIndex
70    // =========================================
71
72    println!("\n--- Example of Index Conversion ---");
73
74    // Create DataFrame from simple index
75    let simple_idx = Index::new(vec!["X".to_string(), "Y".to_string(), "Z".to_string()])?;
76    let mut simple_df = DataFrame::with_index(simple_idx);
77
78    // Add data
79    let values = vec![100, 200, 300];
80    let str_values: Vec<String> = values.iter().map(|v| v.to_string()).collect();
81    simple_df.add_column(
82        "values".to_string(),
83        pandrs::Series::new(str_values, Some("values".to_string()))?,
84    )?;
85
86    println!("Simple Index DataFrame: {:?}", simple_df);
87
88    // Prepare for conversion to MultiIndex
89    let tuples = vec![
90        vec!["Category".to_string(), "X".to_string()],
91        vec!["Category".to_string(), "Y".to_string()],
92        vec!["Category".to_string(), "Z".to_string()],
93    ];
94
95    // Create and set MultiIndex
96    let new_multi_idx = MultiIndex::from_tuples(tuples, None)?;
97    simple_df.set_multi_index(new_multi_idx)?;
98
99    println!("After Conversion to MultiIndex: {:?}", simple_df);
100
101    println!("\n=== Sample Complete ===");
102    Ok(())
103}