我的数据库返回以下格式的数据:
user_id | video_id | liked
0 341 1
1 765 1
0 534 1
3 981 1
我需要将此表转换为以下形式:
user_id | 341 | 765 | 534 | 981
0 1 0 1 0
1 0 1 0 0
3 0 0 0 1
我正在做的是为每个用户 id 生成一行,为每个视频 id 生成一列,0 应该是默认值,除非视频被喜欢。
对于我最初的测试和实验,我使用了 python 的 pandas 库,如下所示:
df = pd.read_csv('data.csv')
pivoted_df = df.pivot_table(
index='user_id',
columns='video_id',
values='liked',
fill_value=0,
)
pivoted_df.to_csv('pivoted_data.csv')
这很简单并且工作完美,但现在我需要在 php 中做同样的事情,但我找不到任何 pandas 替代品。我见过的其他解决方案对列使用键名,但在这里不起作用,因为列可以是任意数字。
为了清楚php中的实际数据结构,从数据库中获取的数据如下所示:
Array
(
[0] => Array
(
[user_id] => 0
[video_id] => 341
[liked] => 1
)
[1] => Array
(
[user_id] => 1
[video_id] => 765
[liked] => 1
)
[2] => Array
(
[user_id] => 0
[video_id] => 534
[liked] => 1
)
[3] => Array
(
[user_id] => 3
[video_id] => 981
[liked] => 1
)
)
它需要看起来像这样:
Array
(
[0] => Array
(
[user_id] => 0
[341] => 1
[765] => 0
[534] => 1
[981] => 0
)
[1] => Array
(
[user_id] => 1
[341] => 0
[765] => 1
[534] => 0
[981] => 0
)
[2] => Array
(
[user_id] => 3
[341] => 0
[765] => 0
[534] => 0
[981] => 1
)
)
这只是一些相对基础的数组操作。这是一种方法:
$rows = [
['user_id' => 0, 'video_id' => 341, 'liked' => 1],
['user_id' => 1, 'video_id' => 765, 'liked' => 1],
['user_id' => 0, 'video_id' => 534, 'liked' => 1],
['user_id' => 3, 'video_id' => 901, 'liked' => 1]
];
// Extract user and video ids
$users = array_unique(array_column($rows, 'user_id'));
$videos = array_unique(array_column($rows, 'video_id'));
// Initialize the table
foreach($users as $user_id)
{
foreach($videos as $video_id)
{
$table[$user_id]['user_id'] = $user_id;
$table[$user_id][$video_id] = 0;
}
}
// Add the likes
foreach($rows as $row)
$table[$row['user_id']][$row['video_id']] += $row['liked'];
$table = array_values($table);
print_r($table);
输出:
Array
(
[0] => Array
(
[user_id] => 0
[341] => 1
[765] => 0
[534] => 1
[901] => 0
)
[1] => Array
(
[user_id] => 1
[341] => 0
[765] => 1
[534] => 0
[901] => 0
)
[2] => Array
(
[user_id] => 3
[341] => 0
[765] => 0
[534] => 0
[901] => 1
)
)